基于本教程: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变量值? 是否可以通过引用传递bool值? 提前谢谢
答案 0 :(得分:10)
那里有几个问题:
'false'
不是false
。
变量在JavaScript中以值传递。总是。因此boolVar
setToFalse
与您传入isOpen
之间没有任何联系。 setToFalse(isOpen)
的处理方式如下:
确定isOpen
的值
值(完全与isOpen
断开连接)传递到setToFalse
JavaScript对原始类型有一些有趣的处理:如果你试图像对象类型一样使用它们(例如var a = 42; a.toFixed(2);
),则将值提升为临时对象,使用该对象,然后该对象被丢弃。因此,如果obj
为false
,则obj.anything = "whatever"
最终成为无操作,因为暂时存在的对象最终会在行完成后立即释放。
您可以通过isOpen
向对象宣传new 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通过显式创建对象来解决,而不是依赖于隐式行为。
但是,请记住上面关于它如何像对象一样行动的警告(因为它是一个),而不是像布尔值?这是一个例子:
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 false isOpen is truthy, what the...?!
...因为isOpen
包含非空对象引用,而非空对象引用总是 truthy 。
答案 1 :(得分:2)
我们可以使用它。
var myBoolean = { value: false }
//get
myBoolean.value;
//set
myBoolean.value = true;
答案 2 :(得分:1)
您正在传递布尔基元变量isObject
。对于原始类型,尝试设置toString
方法没有意义,因为它不需要(和使用),因为在ECMAScript规范中已经定义了to String conversion的规则。
如果你真的想像你正在尝试的那样使用modifyVar
函数,你可以使用布尔对象而不是基元:
function modifyVar(obj, val) {
obj.valueOf = obj.toSource = obj.toString = function(){ return val; };
}
function setToFalse(boolVar) {
modifyVar(boolVar, 'false');
}
var isOpen = new Boolean(true);
setToFalse(isOpen);
console.log('isOpen ' + isOpen);
答案是:使用new Boolean(true)
或Object(true)
。
答案 3 :(得分:-2)
我不确定你是在单引号中指定false,带单引号/双引号的值将被视为字符串。只需使用modifyVar(boolVar,false);并尝试。