如何在javascript函数中更改Bool值?

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

那里有几个问题:

  1. 'false'不是false.

  2. 变量在JavaScript中按值传递.总是.因此,有之间没有任何关系boolVarsetToFalseisOpen你传递进去.setToFalse(isOpen)像这样处理:

    • isOpen确定的价值

    • (完全断开isOpen)传入setToFalse

  3. JavaScript对原始类型有一些有趣的处理:如果你尝试像对象类型一样使用它们(var a = 42; a.toFixed(2);例如),则将值提升为临时对象,使用该对象,然后丢弃该对象.因此,如果objfalse,则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对象引用总是真实的.


bar*_*rak 8

我们可以使用它。

var myBoolean = { value: false }

//get
myBoolean.value;

//set
myBoolean.value = true;
Run Code Online (Sandbox Code Playgroud)