循环对象属性与数字索引数组

时间:2013-02-27 20:45:15

标签: javascript arrays performance loops map

JavaScript中哪个更快:使用整数索引循环数组或循环通过具有属性的对象?如果有的话,性能差异是什么?

var array = [1, 2, 3];
for (var i = 0; i < array.length; i++) {
}

与:相比:

var object = {"1":1, "2":2, "3":3};
for (var x in object) {
}

据我所知,JavaScript数组实际上是由地图支持的,所以我希望两者都能执行相同的操作。非常感谢任何信息!

编辑:我应该澄清一下,我对循环开销感兴趣(比如for in更贵),以及访问每个元素的查询时间(object[x] vs {{1} })。

2 个答案:

答案 0 :(得分:3)

接受的答案使用了无效的基准,完全错误。正如评论所指出的那样console.log将主宰测试结果,使它们无用。看看这个比较:http://jsperf.com/performance-of-array-vs-object/17

数组迭代比对象迭代快约48倍。如果您事先知道对象的键的范围,它会大大改善,但仍然比数组迭代慢得多。

答案 1 :(得分:0)

我创建了一个jsperf http://jsperf.com/array-vs-object-loop

我认为额外的财产访问需要更多时间。在Chrome 24中它并没有太大的区别,在firefox 19中,对象方式需要5-10%的时间。

您可能还应该考虑对象/数组的大小。

编辑:忘记那个答案,看一下接受的答案!