根据javascript documentation,===
运算符的优先级高于&&
运算符。因此,我希望有一个像
false && undefined.foo() === undefined.foo()
在评估undefined.foo()
个调用之一时抛出错误。但是,正如我在node,chrome和firefox中尝试的那样,js引擎总是短路并返回false
,例如
> false && undefined.foo() === undefined.foo()
false
&&
操作数评估后,是否应该===
短路?
答案 0 :(得分:3)
更高的优先级仅意味着在确定undefined.foo()
的操作数之前,两个操作数===
首先与&&
运算符相关联。它没有规定执行顺序,它仍然是从左到右。
运算符优先级仅决定表达式是否被评估为
(false && undefined.foo()) === undefined.foo()
或
false && (undefined.foo() === undefined.foo())
在任何一种情况下,false
仍然是被评估的第一件事;虽然如果&&
具有更高的优先级(第一个带括号的示例),那么第二个undefined
表达式 也将被评估。
答案 1 :(得分:0)
为了更好地可视化为什么按照原样解析优先级,根据解释器排名优先级的方式添加可选括号:
( (false) && ( undefined.foo() === undefined.foo() ) )
由于===
的优先级高于&&
,因此首先在undefined.foo() === undefined.foo()
表达式周围添加括号。由于优先级现已确定,JavaScript解释器现在将从左到右解析它。由于short-circuit evaluation,undefined.foo()
比较表达式永远不会被评估,因为在评估false