在 JS 中使用双括号的运算符优先级

Operator Precedence using double brackets in JS

我得到了这个代码:

let x = -2;
let ex = ((x += 10) > ++x) * 2;
console.log(ex);

想弄清楚为什么这里控制台的输出是0,而我认为应该是2?这是我背后的推理:

当我引用MDN中的优先顺序时,我也需要在这里考虑双括号。这意味着这就是我对我的行动进行优先排序的方式:

  1. +=(在双括号中)//我得到一个值 8
  2. ++(根据全局括号中第二高的优先级)//我得到 -1
  3. >(第三优先级)//此时我将 8 与 -1 进行比较(8 > -1)= true,这意味着值现在变为 1
  4. *(最后一个)// 1 * 2 = 2

以上是我自己的思考过程。你能解释一下为什么我最后应该得到 0 吗?直观上,就是括号中的布尔值需要为false,才能转换为0。然后 0 * 2 = 0.

谢谢。

如果你一次看一个表达式,它是有道理的:

let x = -2;
// x = -2

let ex = (
  ( x+= 10)
  // x = 8 (which is what this expression returns)
  >
  ++x
  // x = 9 (which is what this expression returns)
) * 2:

// In other words:
let ex = (8 > 9) * 2;
// which results in 0

运算符优先级很重要,是的,但这并不意味着 VM 会突然预先计算 > 右侧的表达式。在评估二元运算符表达式时,它总是先评估左侧,然后评估右侧。 (除了 && 可能会跳过右侧).