JavaScript ++运算符无法正常工作

时间:2015-09-02 01:37:31

标签: javascript arithmetic-expressions

为什么当我运行下面的JavaScript代码时,它会提醒10?我希望它能够提醒11.我在多个浏览器中试过这个。

var t=5;
t+=t++;
alert(t);

3 个答案:

答案 0 :(得分:3)

这是因为您使用t++代替++t 第一个首先评估数字然后递增,而第二个则相反。

t = 5; t += ++t // => 11

答案 1 :(得分:3)

假设t = 5

,让我们重写几次以扩展每一步
t += t++;
// same as
t = t + t++;
// same as
t = 5 + t++;
// same as
t = 5 + (t = t + 1, 5); // the second 5 here is the old `t` value
// same as
t = 5 + 5; // the `t = t + 1` becomes obsoleted by the other `t =`
// same as
t = 10;

那我们学到了什么?写得很简单,

t = t + t + 1;
// or
t = 2 * t + 1;
// or if you really like +=
t += t + 1;

如果您想知道为什么t++(t = t + 1, 5)相同,那是因为foo++的定义方式,这意味着

  1. 记住 foo 的价值,让我们称之为 old_foo
  2. 1
  3. 增加 foo
  4. 返回 old_foo
  5. 如果我们把它写成函数,伪代码

    function (foo) { // passing foo by reference
        var old_foo = foo;
        foo = foo + 1; // imaging this is a reference set
        return old_foo;
    }
    

    或者,使用comma operator

    foo = foo + 1, old_foo;
    // i.e. if `foo` was `5`
    foo = foo + 1, 5;
    

答案 2 :(得分:1)

您似乎假设给定left += rightright首先评估 ,然后添加到left。但事实并非如此。

来自spec

  

12.14.4运行时语义:评估

     

AssignmentExpression:LeftHandSideExpression AssignmentOperator AssignmentExpression

     
      
  1. 让lref成为评估LeftHandSideExpression的结果。
  2.   
  3. 让lval成为GetValue(lref)。
  4.   
  5. ...
  6.   

如您所见,左侧在右侧之前进行评估,即在t之前评估t++,此时t仍为5