我在我们的应用程序中遇到了这段代码(已修改),并对它的工作原理感到困惑:
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的值。
答案 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
的值,它们是:null
,undefined
,{{1 },NaN
,零长度字符串,当然还有0
。其他任何东西都会强制false
。
答案 1 :(得分:2)