【问题标题】:Loop object properties vs numerically indexed array循环对象属性与数字索引数组
【发布时间】:2013-02-13 20:19:21
【问题描述】:

在 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]array[i])。

【问题讨论】:

  • jsperf.com 就在那里供您使用...

标签: javascript arrays performance loops map


【解决方案1】:

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

数组迭代比对象迭代快大约 48 倍。如果你提前知道对象的键的范围,它会大大提高,但仍然比数组迭代慢得多。

【讨论】:

    【解决方案2】:

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

    我认为额外的属性访问需要更多时间。在 chrome 24 中它没有太大区别,在 Firefox 19 中,对象方式需要 5-10% 的时间。

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

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

    【讨论】:

    • 谢谢!我不知道这个用于创建性能测试的网站。
    • 似乎您将整个数组记录在循环中,而不是单个条目。这与对对象的循环不同。
    • 是的,你说得对,我的错。我修好了它!结果似乎保持不变......(至少对我来说)
    • console.log 是该测试中最耗时的。没有console.log,您可以看到迭代数组比对象快得多:jsperf.com/array-vs-object-loop/23
    猜你喜欢
    • 2015-07-04
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    相关资源
    最近更新 更多