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如果&&
具有更高的优先级(第一个括号的例子),那么第二个undefined
expression式也总是被评估。
为了更好地理解为什么按照它的方式parsing优先级,请根据解释器的优先顺序添加可选的括号:
( (false) && ( undefined.foo() === undefined.foo() ) )
因为===
优先级比&&
,所以首先围绕undefined.foo() === undefined.foo()
expression式添加括号。 由于优先级已经确定,所以JavaScript解释器现在将从左到右进行parsing。 由于短路评估 , undefined.foo()
比较expression式从不被评估,因为条件在评估false
退出