【问题标题】:Operator Precedence using double brackets in JSJS中使用双括号的运算符优先级
【发布时间】:2021-08-04 20:45:27
【问题描述】:

我得到了这个代码:

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

谢谢。

【问题讨论】:

  • x+=10++x 之前变异x
  • 我现在明白了!第一次操作后 x 已更改为 8。我们使用 8 而不是 -2 向前移动。谢谢!
  • 运算符优先级和评估顺序是两个不同的东西。比较(++x < (x += 10)) * 2;,它使用相同的优先规则,但具有不同的评估顺序。

标签: javascript operators operator-precedence


【解决方案1】:

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

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

【讨论】:

  • 感谢开尔文!我现在对这里的流程有点困惑 - (++x < (x += 10)) * 2。为什么我们会得到 0 而不是 2?
  • 我们最终得到(-1 < (x = -1 + 10)) * 2,即(-1 < 9) * 2(使用x==9),所以再次得到false * 2,即0。
  • 对不起,愚蠢的问题.. 但这是我没有完全理解的部分 // 为什么 -1 false?
  • @chessplayer 不,我是这里的笨蛋,我以为它还在使用>。我刚才用< 运行了你的代码,结果实际上是2,这是true * 2 的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2016-05-06
  • 2011-07-07
相关资源
最近更新 更多