2012-03-09 116 views
2

是否有任何性能差異性能區別for循環和for ..在循環時在JavaScript中迭代數組?

之間
var a = [10,20,30,40];// Assume we have thousands of values here 

// Approach 1 
var i, len = a.length; 
for(i=0;i<len;i++){ 
    alert(i); 
    alert(a[i]); 
} 

// Approach 2 
for(i in a){ 
    alert(i); 
    alert(a[i]); 
} 
+3

是的。不要用'for..in'迭代數組,你可能會以隨機順序得到結果,並且還會得到額外的結果。只使用「方法1」,它也更快。 – Teemu 2012-03-09 21:06:54

回答

2

使用for (var i = 0, len = a.length; i < len; i++),因爲它的方式更快,這是正確的方式或迭代數組中的項目。

第一:這是不正確與for (i in a)來遍歷數組,因爲該迭代將包括除數組元素枚舉的屬性。如果已將任何方法或屬性添加到數組中,則在使用for (i in a)時,它們將成爲迭代的一部分,這在嘗試遍歷數組元素時從來不是您想要的。

第二:正確的選項要快得多(快9-20倍)。請參閱此jsPerf測試,其中顯示for (var i = 0; i < len; i++)選項在Chrome中速度提高約9倍,而在Firefox中提供更多速度差異:http://jsperf.com/for-loop-comparison2

enter image description here

由於可能出現的問題的一個例子使用for (var i in a),當我使用時,包含在項目MooTools的圖書館,我得到的所有的這些值i時:

0 
1 
2 
3 
$family 
$constructor 
each 
clone 
clean 
invoke 
associate 
link 
contains 
append 
getLast 
getRandom 
include 
combine 
erase 
empty 
flatten 
pick 
hexToRgb 
rgbToHex 

這似乎是mootools添加到數組對象的一堆方法。

0

我不知道跨瀏覽器,但在我的測試與Firefox有。 for (i=0; etc...)要快得多。這是一個顯示差異的jsfiddle示例。 http://jsfiddle.net/pseudosavant/VyRH3/

添加到您可以用(for i in etc)Array對象已經原型(也許在庫)遇到,你應該總是使用for (i=0; etc...)用於遍歷數組的問題。

(for i in etc)應該只能用於對象。