zoukankan      html  css  js  c++  java
  • js for循环中i++与++i有什么区别

    平时都是这样写的for循环,

    1
    2
    3
    for(var i = 0; i < 20 ; i++){     
      ....      
    }

    但我看有的人这样写

    for (var i = 0; i < 20 ; ++i) {
      ....
    }

    这样会对for循环有什么影响?

    1.在for里好像没啥区别...

    但是用在赋值的时候, 就有区别了...

    var a = 1;
    var b = a++;
    var c = 1;
    var d = ++c;
    console.log(b,d);  // 1, 2

    a++ 是先应用a, 然后再自加
    ++a 是先自加, 然后在应用a

    2.大概是 C/C++ 时代带来的习惯,传说 ++i 比 i++ 要快,但事实上这两者的性能在js中是差不多的。

    至于具体细节,规范里面关于自增/自减运算符是这么写的:

    对于放在前面的情况——

    UnaryExpression : ++ UnaryExpression

    1. Let expr be the result of evaluating UnaryExpression.

    2. Let oldValue be ToNumber(GetValue(expr)).

    3. ReturnIfAbrupt(oldValue).

    4. Let newValue be the result of adding the value 1 to oldValue, using the same rules as for the + operator (see 12.7.5).

    5. Let status be PutValue(expr, newValue).

    6. ReturnIfAbrupt(status).

    7. Return newValue.

      大致翻译一下:

    1. 令expr等于当前表达式(就是++后面的部分)的结果

    2. 令oldValue等于expr转换为数字的结果

    3. 使用和“+”运算符一样的规则,令newValue = oldValue + 1

    4. 将newValue赋值给expr

    5. 整个运算式返回newValue

    对于放在后面的情况——

    PostfixExpression : LeftHandSideExpression ++

    1. Let lhs be the result of evaluating LeftHandSideExpression.

    2. Let oldValue be ToNumber(GetValue(lhs)).

    3. ReturnIfAbrupt(oldValue).

    4. Let newValue be the result of adding the value 1 to oldValue, using the same rules as for the + operator (see 12.7.5).

    5. Let status be PutValue(lhs, newValue).

    6. ReturnIfAbrupt(status).

    7. Return oldValue.

    大致翻译——

    1. 令lhs等于当前表达式(++前面的部分)的结果

    2. 令oldValue等于lhs转换为数字的结果

    3. 使用和“+”运算符一样的规则,令newValue = oldValue + 1

    4. 将newValue赋值给lhs

    5. 整个运算式返回oldValue

    可以看到,这两者的的区别只是最后一步,整个运算式是返回加一后的还是加一前的。

    对于for语句而言:

    for(var i = 0; i < n; i++)

    最后一栏仅仅是自加,并没有把这个值赋值给谁,所以从这一点来看,++符号放在前面或者是后面都是一样的。

    3.事实上没有太大区别。但是如果要追求那一点点效率问题的话,++i确实会效率高一些.

    确实是从c++的std标准库而来,当i是一个std容器的iterator时,i不是一个数字,i++会多产生一个赋值操作,因此++i性能更高。所以c++习惯的人,在i不是数值时,喜欢用++i来节省开销。

  • 相关阅读:
    忏悔书(IT攻城狮)
    【博文汇总】彩色图像分割 Menu
    【Android】Android 4.2源码下载(ubuntu 12.10)
    【My Project】织物疵点检测机器视觉系统 软件测试平台
    【NFC】Android NFC API Reference中英文
    【分享】RSS订阅技巧及工具和实用RSS链接分享
    【流媒體】live555—VS2010/VS2013 下live555编译、使用及测试
    vc++ win32项目属性介绍(二、c/c++)
    c风格回调函数 vs c++风格虚基类,关于接口定义和调用的对比
    关于移动技术的我的看法(二)
  • 原文地址:https://www.cnblogs.com/wangtong111/p/11271196.html
Copyright © 2011-2022 走看看