为什么Javascript的OR返回的值不是true/false?

Fle*_*ore 19 javascript syntax

为了获得浏览器视口宽度,我看到了这种结构:

function () { return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; }
Run Code Online (Sandbox Code Playgroud)

我理解涉及的浏览器怪癖.我不明白的是为什么要||返回价值.所以我试过这个alert(undefined || 0 || 3);,果然,它发出警报3.我觉得这很离奇,因为我期待true或者false.谁能解释一下发生了什么?

Mat*_*nen 23

如果JavaScript运算符的计算结果为truthy值,则将其||定义为返回左值,否则返回正确的值而不是返回true自身.这就是它在规范中定义的方式.

我知道它有时会很烦人,你可能会不小心拿到一些你不想坚持的东西的引用,但它也允许你的例子有方便的技巧.一切都有其优点和缺点.


Pau*_*xon 18

查看ECMAScript标准部分11.11二进制逻辑运算符

生产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


Poi*_*nty 13

不要把它想象成"或".它更像是表达式中的流量控制设备.||的值 表达式是第一个"truthy"子表达式的值.因此,对一系列子表达式的评估在某个时刻停止,好像

 expr1 || expr2 || expr3
Run Code Online (Sandbox Code Playgroud)

 (function() {
   var rv = expr1;
   if (rv) return rv;
   rv = expr2;
   if (rv) return rv;
   return expr3;
 })()
Run Code Online (Sandbox Code Playgroud)


mdm*_*dma 6

OR函数是一个短路OR评估 - 它返回第一个非false的元素,否则返回最后一个false元素.

这实际上非常有用,所以你可以编写像这样的表达式

a = a || someValue;
Run Code Online (Sandbox Code Playgroud)

哪个是一样的

if (a==null)
  a = someValue;
Run Code Online (Sandbox Code Playgroud)

  • 这不仅仅是“非空”。空字符串和数字零都被视为“假”。“未定义”伪值也被视为“假”,尽管这就是事情变得有点奇怪的地方。 (2认同)