基于本教程: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
  • 在JavaScript中,变量通过值传递给。总是。因此,boolVar中的setToFalse与您要传递到其中的isOpen之间没有任何连接。 setToFalse(isOpen)的处理如下:
  • isOpen的值由
  • 确定
  • 该值(与isOpen完全断开连接)被传递到setToFalse
  • JavaScript对原始类型进行了一些有趣的处理:如果尝试像对象类型(例如var a = 42; a.toFixed(2);)一样使用它们,则该值将提升为临时对象,使用该对象,然后将该对象丢弃。因此,如果objfalse,那么obj.anything = "whatever"最终将成为无操作者,因为临时存在的对象将在行结束时立即被释放。

  • 您可以通过isOpennew 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包含非空对象引用,并且非空对象引用始终是真实的。

    10-06 06:26