2014-03-31 332 views

回答

7

&&营运人员收入由内部胁迫的表达式的值到布尔值,但结果操作者总是失败的第一个表达式(即,这是falsey)的实际,不受胁迫值。由于true而不是 falsey。同样,(true && 0)将评估为0

+3

结果是失败的_first_表达式的uncoerced值(因为一旦失败,执行就会停止)。 –

+1

@AaronDufour哦对了;杜尔。谢谢! – Pointy

4

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

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

a = b ? b : c; 

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

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

为了形式化别人在说什么,这里有什么ECMAScript specification说,关于如何逻辑运算符评估:

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

也许最相关的,在段11.11的底注:

由& &或产生的值||运算符不一定是 布尔类型。生成的值将始终为两个操作数表达式中的一个的值。

+0

谢谢。我浪费时间在查看“未定义”的文档,而不是AND运算符 – ThePizzle

0

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

布尔||和布尔&&运营商的结果总是考虑到短路,评估上一个表达式的结果。

因此,对于||,如果第一个表达式是truthy,则短路评估意味着其余部分将被忽略,结果将为该第一个表达式的值。如果是falsy,则评估必须继续执行第二个表达式,并且结果将是第二个表达式的结果,而不管它是真是假。

同样对于&&,如果第一表达式是falsy然后评价停止,结果是,第一表达式的结果,如果它是truthy然后评估继续,结果是第二个表达式的结果。

相关问题