首页 > 解决方案 > 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

谢谢。

标签: javascriptoperatorsoperator-precedence

解决方案


如果您一次只看一个表达式,这是有道理的:

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 会突然预先计算>. 在计算二元运算符表达式时,它总是先计算左侧,然后再计算右侧。(除了例如&&可能跳过右侧的地方)


推荐阅读