逻辑与 (&&) 和逻辑或 (||) 的运算符优先级

Operator precedence for logical AND (&& )and logical OR (||)

根据 JavaScript 的 operator precedence table,我可以看到 && 的优先级高于 ||

因此,对于以下代码片段:

let x, y;
let z = 5 || (x = false) && (y = true);
console.log(z);  // 5
console.log(x);  // undefined 
console.log(y);  // undefined 

我认为应该先对&&求值,&&部分短路后,x会被赋值为false。然后只有 || 会被尝试评估。

但是,从 console.log 的输出中,我可以清楚地看出这里不是这种情况。

有人可以帮我看看我在这里遗漏了什么吗?

提前致谢。

||&&运算符优先级的意思是:

let z = 5 || (x = false) && (y = true);

被评估为:

let z = 5 || ((x = false) && (y = true));

而不是

let z = (5 || (x = false)) && (y = true);

这并不表示何时 计算运算符每一侧的值。这是由每个操作员的机械师完成的。例如,对于 ||,它是 specified here:

1. Let lref be the result of evaluating LogicalANDExpression.
2. Let lval be ? GetValue(lref).
3. Let lbool be ToBoolean(lval).
4. If lbool is false, return lval.
5. Let rref be the result of evaluating BitwiseORExpression.
6. Return ? GetValue(rref).

它在 GetValue(rref) 运行之前评估 GetValue(lref)

换句话说,运算符优先级指示哪些标记应用于哪个运算符,以及以什么顺序应用,而不是 how/when 给定运算符计算其左侧和右侧的值。