在javascript中迭代数组时for循环和for循环之间的性能差异?

时间:2012-03-09 21:02:20

标签: javascript performance

之间是否有任何性能差异
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]);
}

2 个答案:

答案 0 :(得分: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添加到数组对象的一堆方法。

答案 1 :(得分: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)只能在对象上使用。

相关问题