JS && 优先级与 ===

JS && precedence vs ===

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

这样的表达式

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

在计算 undefined.foo() 调用之一时抛出错误。但是,正如我在节点、chrome 和 firefox 中尝试过的那样,js 引擎总是短路并且 returns false 例如

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

&&=== 操作数计算完成后 短路不应该启动吗?

更高的优先级仅意味着两个操作数 undefined.foo() 在决定​​ && 的操作数之前首先与 === 运算符相关联。它不规定执行顺序,仍然是从左到右。

运算符优先级仅决定表达式是否被计算为

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

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

在任何一种情况下,false 仍然是第一个被评估的东西;尽管如果 && 具有更高的优先级(第一个带括号的示例),那么第二个 undefined 表达式 也会 也总是被评估。

为了更好地理解为什么优先级被这样解析,根据解释器如何排列优先级添加可选的括号:

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

因为 === 的优先级高于 &&,所以首先在 undefined.foo() === undefined.foo() 表达式周围添加括号。由于现在已经确定了优先级,JavaScript 解释器现在将从左到右解析它。由于 short-circuit evaluationundefined.foo() 比较表达式永远不会被计算,因为条件在计算 false

时退出