基于本教程:link
这是我的示例代码:
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);
如何更改函数中的 bool(boolean) 变量值?是否可以通过引用传递 bool(boolean) 值?
提前致谢
最佳答案
那里有几个问题:
'false'
不是false
。 boolVar
中的setToFalse
与您要传递到其中的isOpen
之间没有任何连接。 setToFalse(isOpen)
的处理如下:isOpen
的值由isOpen
完全断开连接)被传递到setToFalse
var a = 42; a.toFixed(2);
)一样使用它们,则该值将提升为临时对象,使用该对象,然后将该对象丢弃。因此,如果obj
是false
,那么obj.anything = "whatever"
最终将成为无操作者,因为临时存在的对象将在行结束时立即被释放。 您可以通过
isOpen
将new Boolean
提升为对象来执行类似的操作,但是请注意,它随后将像对象一样工作,而不是 bool(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);
<!-- 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>
之所以可行,是因为
isOpen
中的值是对对象的引用。因此,当将该值作为setToFalse
传递到boolVar
时,boolVar
的值是该引用的副本,因此引用同一对象。这样可以解决上面的问题2。问题3通过显式创建对象而不是依靠隐式行为来解决。但是,还记得我上面的警告,它关于它如何像一个对象(因为它是一个对象)而不是一个 bool(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);
if (isOpen) {
snippet.log("isOpen is truthy, what the...?!");
} else {
snippet.log("isOpen is falsey");
}
<!-- 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>
我们看:
isOpen错误
isOpen是真实的,什么...?!
...因为
isOpen
包含非空对象引用,并且非空对象引用始终是真实的。