之间是否有任何性能差异
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]);
}
答案 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。
作为使用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)
只能在对象上使用。