gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:45:08 25 4
gpt4 key购买 nike

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

最佳答案

有几个问题:

  • 'false'不是 false .
  • 传递变量 按值 在 JavaScript 中。总是。所以boolVar之间没有任何联系。在 setToFalseisOpen你正在进入它。 setToFalse(isOpen)是这样处理的:
  • isOpen的值确定
  • 该值(与 isOpen 完全断开)被传递到 setToFalse
  • JavaScript 对原始类型有一些有趣的处理:如果您尝试像对象类型一样使用它们(例如 var a = 42; a.toFixed(2);),则该值将提升为临时对象,使用该对象,然后丢弃该对象。所以如果 objfalse , obj.anything = "whatever"最终成为一个空操作,因为临时存在的对象最终会在该行结束后立即释放。

  • 您可以通过推广 isOpen 来做类似的事情。通过 new Boolean 到一个对象,但是 请注意它会像一个对象,而不是一个 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 中的值是一个对象的引用。所以当这个值被传递到 setToFalseboolVar , boolVar的值是该引用的副本,因此指向同一个对象。这样就解决了上面的问题#2。问题 #3 是通过显式创建对象来解决的,而不是依赖于隐式行为。

    但是 ,还记得我上面关于它如何像一个对象(因为它是一个)而不是一个 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包含非空对象引用,并且非空对象引用始终为真。

    关于javascript - 如何在javascript中的函数内更改Bool值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26829207/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com