将JavaScript对象进行AND操作

8
我在我们的应用程序中遇到了这段代码(已修改),但对它的工作原理感到困惑:

    function someObject()
    {
        this.someProperty = {};
        this.foo = 
        {
            bar:
            {
                baz: function() { return "Huh?" }
            }
        };

        this.getValue = function()
        {
            return (this.someProperty && this.foo.bar && this.foo.bar.baz && this.foo.bar.baz()) || null;
        }
    }

    function test()
    {
        var o = new someObject();
        var val = o.getValue();
        alert(val);
    }

当您调用test()函数时,将弹出文本“Huh?”。我不确定getValue的结果如何返回该值,我原以为执行A && B && C && D会返回true,而不是D的值。

2个回答

15
那是因为 JavaScript 中的 布尔运算符 可以返回一个操作数,而不一定是 Boolean 结果,例如:

逻辑 AND 运算符 (&&),如果第一个操作数为真,则返回第二个操作数的值:

true && "foo"; // "foo"

如果第一个操作数本身为“falsy”,则它将返回第一个操作数的值:
NaN && "anything"; // NaN
0 && "anything";   // 0

这就是为什么在你的示例中返回"Huh?",因为所有前面的表达式都是真实的:

alert("A" && "B" && "C" && "Huh?"); // "Huh?"
alert(true && true && true && "Huh?"); // "Huh?"

逻辑或运算符(||)具有类似的行为,如果第一个操作数为假值,则返回第二个操作数的值。
false || "bar"; // "bar"

如果第一个操作数本身不是假值,它将返回第一个操作数的值:

"foo" || "anything"; // "foo"

这种行为通常用于设置默认值,例如:

function test (arg1) {
  arg1 = arg1 || "default value";
}

注意: 在布尔值上下文中,Falsy 值是那些被强制转换为 false 的值,它们包括:nullundefinedNaN0、零长度的字符串以及当然还有 false。其他任何值都会被强制转换为 true


这可能会解决他的问题:!!(this.someProperty && this.foo.bar && this.foo.bar.baz && this.foo.bar.baz())。请注意 "!!"。 - David Murdoch
2
相关的是,这个问题的存在证明了在逻辑中使用这些布尔语法快捷方式应该被视为不好的形式... "说你的意思", 三月兔说道。 - dkamins
1
JavaScript 中常被误解的运算符的优秀总结! - Mike Clark
这是Javascronic吗?(针对Python极客的Javascript?) - Rob

2

我正准备把那个作为评论添加进去。 :) 谢谢! - Jonas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接