JS&&优先级vs ===

时间:2016-01-06 12:06:58

标签: javascript node.js operators

根据javascript documentation===运算符的优先级高于&&运算符。因此,我希望有一个像

这样的表达式

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

在评估undefined.foo()个调用之一时抛出错误。但是,正如我在node,chrome和firefox中尝试的那样,js引擎总是短路并返回false,例如

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

&&操作数评估后,是否应该===短路?

2 个答案:

答案 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 evaluationundefined.foo()比较表达式永远不会被评估,因为在评估false

时条件退出