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

时间:2014-11-09 14:24:35

标签: javascript reference boolean

基于本教程: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值? 提前谢谢

4 个答案:

答案 0 :(得分:10)

那里有几个问题:

  1. 'false'不是false

  2. 变量在JavaScript中以传递。总是。因此boolVar setToFalse与您传入isOpen之间没有任何联系。 setToFalse(isOpen)的处理方式如下:

    • 确定isOpen的值

    • (完全与isOpen断开连接)传递到setToFalse

  3. JavaScript对原始类型有一些有趣的处理:如果你试图像对象类型一样使用它们(例如var a = 42; a.toFixed(2);),则将值提升为临时对象,使用该对象,然后该对象被丢弃。因此,如果objfalse,则obj.anything = "whatever"最终成为无操作,因为暂时存在的对象最终会在行完成后立即释放。

  4. 您可以通过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);并尝试。