在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)。
我缺少什么?
答案 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。如果a
为true
且运算符为||
,则会发生同样的情况。这也称为短路。