JS &&优先与===

根据JavaScript 文档 , ===运算符比&&运算符更高的优先级。 因此,我希望有一个像

false && undefined.foo() === undefined.foo()

在评估其中一个undefined.foo()调用时抛出一个错误。 但是,正如我在节点,铬和Firefox尝试,JS引擎总是短路,并返回false例如

 > false && undefined.foo() === undefined.foo() false 

===操作数被评估之后不应该&&短路吗?

较高的优先级仅意味着两个操作数undefined.foo()在与&&的操作数被确定之前首先与===操作符相关联。 它并不决定执行顺序,这个顺序仍然是左的。

运算符优先级仅决定expression式是否被评估为

 (false && undefined.foo()) === undefined.foo() 

要么

 false && (undefined.foo() === undefined.foo()) 

在任何一种情况下, false仍然是被评估的第一件事情; 尽pipe如果&&具有更高的优先级(第一个括号的例子),那么第二个undefinedexpression式总是被评估。

为了更好地理解为什么按照它的方式parsing优先级,请根据解释器的优先顺序添加可选的括号:

( (false) && ( undefined.foo() === undefined.foo() ) )

因为===优先级比&& ,所以首先围绕undefined.foo() === undefined.foo()expression式添加括号。 由于优先级已经确定,所以JavaScript解释器现在将从左到右进行parsing。 由于短路评估 , undefined.foo()比较expression式从不被评估,因为条件在评估false退出

Interesting Posts