为了获得浏览器视口宽度,我看到了这种结构:
function () { return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; }
我理解所涉及的浏览器怪癖。我不明白的是为什么||
返回值。所以我尝试了这个alert(undefined || 0 || 3);
,当然,它会提醒3
。我觉得这很奇怪,因为我希望true
或false
。谁能解释一下发生了什么?
答案 0 :(得分:22)
JavaScript运算符||
被定义为如果它评估为真值,则返回左值,否则返回正确值而不是返回true
本身。这就是它在规范中的定义。
我知道它有时很烦人,你可能会不小心拿到你不想要坚持的东西的引用,但它也允许你的例子有方便的技巧。一切都有其优点和缺点。
答案 1 :(得分:17)
查看ECMAScript标准部分11.11 Binary Logical Operators
生产LogicalORExpression: LogicalORExpression || LogicalANDExpression评估为 如下:
1.评估LogicalORExpression。
2.Call GetValue(结果(1))。
3.Call ToBoolean(Result(2))。
4.如果结果(3)为真,则返回结果(2)。
5.评估LogicalANDExpression。
6.Call GetValue(结果(5))。
7.返回结果(6)。
因此它评估每个操作数的布尔转换,但返回操作数的实际值。
如果您想知道Javascript如何将值转换为布尔值,请参阅9.2 ToBoolean
部分答案 2 :(得分:13)
不要将其视为“或”。它更像是表达式中的流量控制设备。 ||的值表达式是第一个“truthy”子表达式的值。因此,对一系列子表达式的评估在某个时刻停止,好像
expr1 || expr2 || expr3
是
(function() {
var rv = expr1;
if (rv) return rv;
rv = expr2;
if (rv) return rv;
return expr3;
})()
答案 3 :(得分:6)
OR函数是一个短路OR评估 - 它返回第一个非false的元素,否则返回最后一个false元素。
这实际上非常有用,所以你可以编写像
这样的表达式a = a || someValue;
与
相同if (a==null)
a = someValue;
答案 4 :(得分:2)
这就是它的设计方式。 ||
与&&
是短路运算符一样,表达式按顺序计算,它们在表达式满足条件后停止并产生表达式的结果。 &&
:
var myObj = { "Test": { "Foo":"Bar" } };
var myObj2 = { "Foo": "Bar" };
alert(myObj.Test && myObj.Test.Foo); // will alert "Bar";
alert(myObj2.Test && myObj2.Test.Foo); // will alert undefined;
答案 5 :(得分:1)
某些值(例如零,""
或undefined
)被视为false。其他任何事情都是正确的,因此||
运算符只返回它给出的对中的第一个非零(即真)值。这对于像上面代码这样的技巧很有用,但我猜它没有添加到语言中只是为了让你跳过奇怪的if语句。
我怀疑它可能起源于性能调整,因为更高级别的语言(例如BASIC ......是的,可能是更高级别的奇怪定义)使用固定常量来表示真和假 - 通常是0和-1,或0和1。