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 evaluation,undefined.foo()
比较表达式永远不会被计算,因为条件在计算 false
时退出
根据 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 evaluation,undefined.foo()
比较表达式永远不会被计算,因为条件在计算 false