szu*_*rse 2 javascript boolean reference
基于本教程:链接
这是我的示例代码:
function modifyVar(obj, val) {
obj.valueOf = obj.toSource = obj.toString = function(){ return val; };
}
function setToFalse(boolVar) {
modifyVar(boolVar, 'false');
}
var isOpen = true;
setToFalse(isOpen);
console.log('isOpen ' + isOpen);
Run Code Online (Sandbox Code Playgroud)
如何更改函数中的bool变量值?是否可以通过引用传递bool值?提前致谢
T.J*_*der 10
那里有几个问题:
'false'不是false.
变量在JavaScript中按值传递.总是.因此,有之间没有任何关系boolVar在setToFalse和isOpen你传递进去.setToFalse(isOpen)像这样处理:
isOpen确定的价值
该值(完全断开isOpen)传入setToFalse
JavaScript对原始类型有一些有趣的处理:如果你尝试像对象类型一样使用它们(var a = 42; a.toFixed(2);例如),则将值提升为临时对象,使用该对象,然后丢弃该对象.因此,如果obj是false,则obj.anything = "whatever"最终成为无操作,因为暂时存在的对象最终会在行完成后立即释放.
你可以通过向对象推广来做你喜欢做的事情,但要注意它会像对象一样,而不是布尔:isOpennew Boolean
function modifyVar(obj, val) {
obj.valueOf = obj.toSource = obj.toString = function(){ return val; };
}
function setToFalse(boolVar) {
modifyVar(boolVar, false);
}
var isOpen = new Boolean(true); // An object
setToFalse(isOpen);
snippet.log('isOpen ' + isOpen);Run Code Online (Sandbox Code Playgroud)
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>Run Code Online (Sandbox Code Playgroud)
这是有效的,因为值in isOpen是对对象的引用.因此,当该值传递给setToFalseas时boolVar,boolVar's值是该引用的副本,因此引用同一个对象.因此,排除上面的问题#2.问题#3通过显式创建对象来解决,而不是依赖于隐式行为.
但是,请记住我上面的关于它将如何像一个对象(因为它是一个)的警告,而不是像布尔值?这是一个例子:
function modifyVar(obj, val) {
obj.valueOf = obj.toSource = obj.toString = function(){ return val; };
}
function setToFalse(boolVar) {
modifyVar(boolVar, false);
}
var isOpen = new Boolean(true); // An object
setToFalse(isOpen);
snippet.log('isOpen ' + isOpen);
if (isOpen) {
snippet.log("isOpen is truthy, what the...?!");
} else {
snippet.log("isOpen is falsey");
}Run Code Online (Sandbox Code Playgroud)
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>Run Code Online (Sandbox Code Playgroud)
我们看:
isOpen false isOpen is truthy, what the...?!
...因为isOpen包含非null对象引用,并且非null对象引用总是真实的.
我们可以使用它。
var myBoolean = { value: false }
//get
myBoolean.value;
//set
myBoolean.value = true;
Run Code Online (Sandbox Code Playgroud)