2014-04-28 105 views
0

雖然與的JavaScript新的陣列功能發揮的性能差異的,我看到的性能在下面的代碼中的一些重大分歧:的jsfiddle:http://jsfiddle.net/jKUm5/原因在不同的迭代器

最慢for var i in array(67.2ms) :

for (var a=0;a<amount;a++) { 
    for (var b in arr) { 
     arr[b]++; 
    } 
} 

JS 5.1 array.forEach(2.1ms):

for (var c=0;c<amount;c++) { 
    arr.forEach(function(e,i,a) { 
     arr[i]++; 
    }); 
} 

最快(默認)for var i=0;i<array.length;i++(1.1ms):

for (var d=0;d<amount;d++) { 
    for (var e=0;e<arr.length;e++) { 
     arr[e]++; 
    } 
} 

我認爲這是使用for var i in array而不是默認的一個很好的做法,但似乎默認是最快速!

我的主要問題是:

  • 什麼是落後的for var i in array的糟糕表現的原因是什麼?
  • 默認迭代器和新的迭代器之間有什麼區別(有另一個迭代器方法的必要性)?
+0

不應在數組中使用for-in循環,而應使用對象。 – adeneo

回答

1

for-in一個循環迭代的對象,而不是僅僅數組值上的所有屬性。因此,它必須從對象中檢索這些屬性值,而不是像其他兩種方法那樣製作數組索引。除了迭代數組的錯誤方式之外,它並不讓我感到驚訝。但不管速度如何,迭代數組是錯誤的。如果有人向Array原型添加可迭代的方法或屬性,那麼該屬性將顯示在您的for-in數組迭代中。

.forEach()是爲了方便,有時由回調創建的閉包很方便(特別是當您想訪問異步回調中的數組索引時)。它可能會比較慢,因爲它涉及一個函數調用,每個迭代都有參數,而第三個方法在每次迭代時都沒有額外的函數調用。

僅供參考,.forEach()方法是Firefox中三者中速度最慢的,所以這也因瀏覽器而異。