Javascript 运算符优先级问题:i = i— + ++i

Javascript operator precedence question: i = i— + ++i

请考虑这段代码:

var i = 1;
i = i-- + ++i;

我对运算符&操作数的处理顺序的理解如下:

  1. i加1(前缀增量)
  2. i被加到i(加法)
  3. i减1(post-固定减量)
  4. 右边的值赋给i(赋值操作)

如果我的理解是正确的,i 的最终值应该是 3。但是,我使用一些在线 javascript 解释器打印出结果,i 的最终值是 2。

我哪里错了?

JavaScript 总是按从左到右的顺序计算子表达式,然后应用运算符:

// parentheses added for clarity
i = (i--) + (++i); // i = 1

i =   1   + (++i); // i = 0 after i--

i =   1   +   1  ; // i = 1 after ++i

i =       2      ;
var i = 1;
i = i-- + ++i;

这就是编译器处理这段代码的方式

  1. 创建一个名为 i 的变量
  2. 将 i 的值设置为 1
  3. (rhs第一个元素)取i的值(1)减值(i现在为0)
  4. (rhs 第二个元素) i 的增量值(i 现在是 1)
  5. 将 i 的值设置为 rhs (2)

理解优先值的逻辑:

var i = 1;
i = i-- + ++i;

prefix increment(++i) precedence  = 17
postfix decrement(i--) precedence = 16

addition(+) precedence = 14

i = 1 + 1
i = 2

可以在以下位置找到更多与优先级相关的信息, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence