一个简单的JS函数,求结果解释

function a(){
    var num = 0;
    for(var i = 0;i < 10;i++){
        num = num++;
    } 
    console.log(num);
};
a();

为什么结果是 0?

阅读 2.9k
6 个回答

num++ 会将 num 自增,然后返回 num 原来的值。

num = num++;num 原来的值(自增前的值,0)又赋值给了 num ,于是 num = num++ 整体并没有改变 num 的值。


关于评论里提到的赋值自增的顺序问题,还是去看标准吧。
自增

  1. Let lhs be the result of evaluating LeftHandSideExpression.
  2. Let oldValue be ? ToNumber(? GetValue(lhs)).
  3. Let newValue be the result of adding the value 1 to oldValue, using the same rules as for the + operator (see 12.8.5).
  4. Perform ? PutValue(lhs, newValue).
  5. Return oldValue.

可以看到 num++,先完成了自增(第4步),然后才返回。
赋值只能在拿到返回之后执行,自然是将旧值赋给(已经自增之后的) num 了。

注意这句话在不同的编程语言里可能会有不同的解释,不要混淆 ...

++在后,先赋值再自增;++在前,先自增再赋值

function a(){
    var num = 0;
    for(var i = 0;i < 10;i++){
        num = ++num;
    } 
    console.log(num);
};
a();

num=num++

  1. num++为0,然后num值自增变为1
  2. 等号左边被赋值的是num++的结果,即最后num=0
新手上路,请多包涵

num++ 是先用后加
所以 num = num++ 等于 num = 0;
可以将num = num++改为num++即可。

避免使用num++会好一些吧,使用++num不容易出错

没必要研究这个, 因为没有意义.
这种容易引发歧义东西, 不要用, 单独写到一行.
我就敢问各位, 有几个不是事后诸葛亮, 事前你知道? !

JS类似这种细节的东西多了, 你能记住吗?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题