性能区别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]);
}
答
使用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。
由于可能出现的问题的一个例子使用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)
应该只能用于对象。
是的。不要用'for..in'迭代数组,你可能会以随机顺序得到结果,并且还会得到额外的结果。只使用“方法1”,它也更快。 – Teemu 2012-03-09 21:06:54