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

时间:2010-06-03 13:35:56

标签: javascript syntax

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

function () { return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; }

我理解所涉及的浏览器怪癖。我不明白的是为什么||返回值。所以我尝试了这个alert(undefined || 0 || 3);,当然,它会提醒3。我觉得这很奇怪,因为我希望truefalse。谁能解释一下发生了什么?

6 个答案:

答案 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。