性能区别for循环和for ..在循环时在JavaScript中迭代数组?

问题描述:

是否有任何性能差异性能区别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

使用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添加到数组对象的一堆方法。

我不知道跨浏览器,但在我的测试与Firefox有。 for (i=0; etc...)要快得多。这是一个显示差异的jsfiddle示例。 http://jsfiddle.net/pseudosavant/VyRH3/

添加到您可以用(for i in etc)Array对象已经原型(也许在库)遇到,你应该总是使用for (i=0; etc...)用于遍历数组的问题。

(for i in etc)应该只能用于对象。