为什么"和"之前评估"等于"

时间:2017-07-07 06:48:09

标签: javascript operator-precedence

strict equal(10)的Javascript precedence中大于logical and(6),那么此代码如何运作



var a;
console.log("value of a is", a);
if (a && a.test === "test") {}




不应该抛出错误

  

无法读取未定义的测试。

为伤口添加盐member access的优先级高于两者(19)。

我缺少什么?

2 个答案:

答案 0 :(得分:3)

一些编程语言(如JavaScript)懒惰地评估逻辑表达式。这意味着如果表达式的第一部分(a)为false,则解释器看不到甚至执行第二部分(a.test === "test")的原因,因此不会抛出任何错误。

为了澄清,优先级没有定义执行表达式的实际顺序,只定义了有效顺序。因此member access运算符具有最高优先级并不意味着它将首先执行。解释器仍然可以首先评估a,而不会影响任何更高优先级运算符的结果。您可以将优先级视为隐式括号,如果将表达式编写为(a) && ((a.test) === "test"),则可以清楚地看到a可以并且将首先进行求值,因为它位于表达式的左侧。

答案 1 :(得分:1)

该表意味着在表达式中,元素被评估为

a && (a.test === 'something')而不是(a && a.test) === 'something'

因为优先顺序。这完全独立于如何评估逻辑表达式(按照出现的顺序)。因此,如果a为false,则没有理由评估表达式的其余部分,因为无论&&之后的表达式是什么,该表达式都将为false。如果atrue且运算符为||,则会发生同样的情况。这也称为短路。