JS for循環(huán)中i++ 和 ++i的區(qū)別介紹

字號:


    這篇文章主要介紹了JS for循環(huán)中i++ 和 ++i的區(qū)別介紹的相關(guān)資料,需要的朋友可以參考下
    平時都是這樣寫的for循環(huán)
    for(var i = 0; i < 20 ; i++){
    ....
    }
    但我看有的人這樣寫
    for (var i = 0; i < 20 ; ++i) {
    ....
    }
    這樣會對for循環(huán)有什么影響?
    1.在for里好像沒啥區(qū)別...
    但是用在賦值的時候, 就有區(qū)別了...
    var a = 1;
    var b = a++;
    var c = 1;
    var d = ++c;
    console.log(b,d); // 1, 2
    a++ 是先應(yīng)用a, 然后再自加
    ++a 是先自加, 然后在應(yīng)用a
    2.大概是 C/C++ 時代帶來的習慣,傳說 ++i 比 i++ 要快,但事實上這兩者的性能在js中是差不多的。
    至于具體細節(jié),規(guī)范里面關(guān)于自增/自減運算符是這么寫的:
    對于放在前面的情況——
    UnaryExpression : ++ UnaryExpression
    Let expr be the result of evaluating UnaryExpression.
    Let oldValue be ToNumber(GetValue(expr)).
    ReturnIfAbrupt(oldValue).
    Let newValue be the result of adding the value 1 to oldValue, using the same rules as for the + operator (see 12.7.5).
    Let status be PutValue(expr, newValue).
    ReturnIfAbrupt(status).
    Return newValue.
    大致翻譯一下:
    1.令expr等于當前表達式(就是++后面的部分)的結(jié)果
    2.令oldValue等于expr轉(zhuǎn)換為數(shù)字的結(jié)果
    3.使用和“+”運算符一樣的規(guī)則,令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等于當前表達式(++前面的部分)的結(jié)果
    2.令oldValue等于lhs轉(zhuǎn)換為數(shù)字的結(jié)果
    3.使用和“+”運算符一樣的規(guī)則,令newValue = oldValue + 1
    4.將newValue賦值給lhs
    5.整個運算式返回oldValue
    可以看到,這兩者的的區(qū)別只是最后一步,整個運算式是返回加一后的還是加一前的。
    對于for語句而言:
    for(var i = 0; i < n; i++)
    最后一欄僅僅是自加,并沒有把這個值賦值給誰,所以從這一點來看,++符號放在前面或者是后面都是一樣的。
    3.事實上沒有太大區(qū)別。但是如果要追求那一點點效率問題的話,++i確實會效率高一些.
    確實是從c++的std標準庫而來,當i是一個std容器的iterator時,i不是一個數(shù)字,i++會多產(chǎn)生一個賦值操作,因此++i性能更高。所以c++習慣的人,在i不是數(shù)值時,喜歡用++i來節(jié)省開銷。
    以上所述是小編給大家介紹的JS for循環(huán)中i++ 和 ++i的區(qū)別介紹,希望對大家有所幫助