在JavaScript中,为什么(undefined&& true)返回undefined?

时间:2014-03-31 16:54:43

标签: javascript node.js

使用node.js控制台(节点0.10.24)

> var x = (undefined && true);
undefined
> x;
undefined
> x = (true && undefined);
undefined
> x;
undefined

为什么比较返回未定义?我希望它返回false,因为undefined被认为是" falsey"。

4 个答案:

答案 0 :(得分:9)

&&运算符通过内部将表达式的值强制转换为布尔值,但运算符的结果始终是实际的非校正值失败的第一个表达(即,这是假的)。

因此(true && undefined)将导致undefined,因为true falsey。同样,(true && 0)会评估为0

答案 1 :(得分:5)

在javascript中||&&不保证返回布尔值,并且只有当操作数是布尔值时才会这样做。

a = b || c本质上是一个快捷方式:

a = b ? b : c;

a = b && c本质上是一个快捷方式:

a = b ? c : b;
//or
a = !b ? b : c;

答案 2 :(得分:3)

要正式化别人所说的内容,请参阅ECMAScript specification关于如何评估逻辑AND运算符的内容:

  
      
  1. 让lref成为评估LogicalANDExpression的结果。
  2.   
  3. 让lval成为GetValue(lref)。
  4.   
  5. 如果ToBoolean(lval)为false,则返回lval。
  6.   
  7. 让rref成为评估BitwiseORExpression的结果。
  8.   
  9. 返回GetValue(rref)。
  10.   

也许最相关的是11.11节底部的注释:

  

和&&amp ;;或||运算符不一定是类型   布尔。产生的价值将始终是两者之一的价值   操作数表达式。

答案 3 :(得分:0)

其他答案绰绰有余,我在这里包括我的答案,以防万一其他人的大脑像我一样工作:

布尔值||和布尔&&运算符的结果将始终是评估的最后一个表达式的结果,并考虑到短路。

因此,对于||,如果第一个表达式为truthy,则短路评估意味着忽略其余部分,结果将是第一个表达式的值。如果它是falsy,则评估必须继续到第二个表达式,结果将是第二个表达式的结果,无论它是真实的还是虚假的。

同样对于&&,如果第一个表达式是falsy,那么评估会停止,结果就是第一个表达式的结果,如果它是truthy,那么评估将继续进行,结果是第二个表达式的结果。