将javascript对象加在一起

时间:2010-04-06 18:07:31

标签: javascript

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

    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()函数时,文字“嗯?”警报。我不确定getValue的结果是如何返回的,我会认为做A&& B&& C&& D会返回true,而不是D的值。

2 个答案:

答案 0 :(得分:11)

这是因为JavaScript中的Boolean Operators可以返回操作数,而不一定是Boolean结果,例如:

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

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

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

NaN && "anything"; // NaN
0 && "anything";   // 0

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

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

逻辑OR运算符(||)具有类似的行为,如果第一个操作数 falsy ,它将返回第二个操作数的值:

false || "bar"; // "bar"

如果它本身是非伪造的,它将返回第一个操作数的值:

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

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

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

注意: Falsy值是在布尔上下文中使用时强制为false的值,它们是:nullundefined,{{1 },NaN,零长度字符串,当然还有0。其他任何东西都会强制false

答案 1 :(得分:2)