这是使用一元运算符“++”的测试情况:

var j = 0 ;
console.log(j);
j = j++;
console.log(j);

为此,输出为:
0
0

由于++运算符的位置在操作数的后面,因此它的优先级低于赋值的优先级,我希望“j”先接收其自身的值(即0),然后再递增。那么,为什么第二个console.log(j)调用仍然显示“0”?

明确地说,我知道解决方案是:
// 1)
j++;
// 2)
++j;
// 3)
j += 1;
// 4)
j = ++j;

但是我需要知道为什么在这种特定情况下不执行增量步骤,而不是如何解决它!

最佳答案

使用后增量时,这是一种不直观(但不是“怪异”!)的行为。

语句j = j++可以做到这一点:

  • 评估LHS
  • 在这种情况下,没有什么特别的事情发生,因为您只是简单地命名了一个变量,但这并非总是如此,例如foo() = j++
  • 评估RHS
  • j(0)的当前值,并将其记为结果;
  • 递增j(得到1);
  • 将RHS分配给LHS
  • 记忆说,RHS评估为j(0)的“已记住”值。

  • 结果是无人值守。

    这里的关键是在最终分配之前评估整个RHS并执行后增量。

    http://www.ecma-international.org/ecma-262/5.1/#sec-11.3.1
    http://www.ecma-international.org/ecma-262/5.1/#sec-11.13.1

    10-07 23:47