2017-07-07 35 views
0

在Javascript中precedencestrict equal(10)大于logical and(6),那么请问这个代码工作为什么 “和” 之前的 “平等”

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

评估如果它不抛出错误

无法读取未定义的测试。

而添加盐的伤口优先级为member access高于他们两个(19)。

我在想什么?

+1

'a'是'undefined',所以它是“falsy”,并且快捷方式评估没有进入'a.test' –

+0

不,定义了'a',其属性'test'未定义 –

+0

@LarsBeck nope ,请参阅https://jsfiddle.net/f6ybjety/ –

回答

3

一些编程语言,如JavaScript,懒惰地评估逻辑表达式。这意味着如果表达式的第一部分(a)为假,解释程序甚至没有理由甚至执行第二部分(a.test === "test"),因此不会引发错误。

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

+0

最后一行听起来很有趣。你能否透露更多的信息。 – a1626

+0

如果是这种情况,那么为什么不增加逻辑运算符的优先级并使其更清楚。 – a1626

+0

@ a1626,因为它们没有更高的优先级,最后执行'&&',但在某些情况下不必执行。 – kalsowerus

1

该表的意思是,在表达式类似的元件被评估为

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

因为precedence.this的顺序是完全独立于逻辑表达式是如何评估(按照外观顺序)。所以如果a是错误的,没有理由评估表达式的其余部分,因为不管在&&后面的表达式是否是假的。如果atrue而运营商是||,也会发生同样的事情。这也被称为短路。

+0

如果是这种情况,那么为什么不增加逻辑运算符的优先级并使其更清楚。 – a1626

+1

,因为正则性适用于任何数据类型,并且如果增加逻辑运算符'&&'的优先级,那么您将强制使用该语言,然后在每次要执行比较时使用该分组并结合结果(a === 1)&&(b === 2)&&(c === 3)否则会被解释为'a ===(1 && b)===(2 && c)=== 3',因为您可以看到类似这样的内容会非常冗长或非常混乱。 –

+0

很好的例子来解释它。 – a1626

相关问题