繁体   English   中英

为什么遍历数组时for..in比for循环快

[英]Why are for..in faster than for loops when looping through an array

我一直在想for循环或for..in循环在数组上的位置更远。

我已经使用jsperf对此进行了测试

我的For Loop拥有16,676,377 op/s
for..in仅具有519,853 op/s

那么为什么是:

var a = ["hi", "hi2", "bye", "bye2"];

for (var i in a) {
  return a[i];
}

比较慢:

var a = ["hi", "hi2", "bye", "bye2"];

for (var i = 0; i < a.length; i++) {
  return a[i];
}

您的问题的答案很简单:for in循环不是为处理数组而创建的,它还会执行其他操作,因此不应使用。

for-in语句的主要目的是迭代思想对象的属性,而不是通过数组。 该语句还将进入数组原型链,通过继承的属性进行迭代,我认为您不需要此甚至不知道。

您甚至不知道会以什么顺序进行迭代的另一件有趣的事情。

因此,要记住的主要事情-请勿用于in数组。 仅与对象。

PS作为RobG正确添加:

如果在数组中找不到属性,则for循环也会在[[Prototype]]链上搜索属性。 例如,在[0,,2]上的for循环将一直搜索1直到Object.prototype [[Prototype]]

这里有几处错误。

  1. 您在循环体内的return导致循环在第一次迭代后中止,您的测试无用
  2. for..in对象的属性,数组的元素并不是唯一的属性 您是否要添加属性,例如a.foo = true 将包含在for..in迭代中,但不包含在for迭代中。

请不要使用for..in循环数组。 不。 永远。

它实际上取决于JavaScript引擎的实现。 因为JavaScript是动态类型的,所以解释程序必须做一些工作来建立给定变量的类型。 我怀疑经典的整数迭代器在引擎中是否存在优化,而在for ... in中使用时则不可用。

编辑:

for..in遍历变量的可枚举属性,因此在每个循环中为var i分配了数组中每个字符串的值。

要解释为什么for循环比for in循环更快for in基本上可以理解用于将数据存储在内存中的基础数据结构。 由于基于数组的存储方式,自然地循环遍历基于索引的数组会更快。 它只是内存中的一个位置,数组中的项目也存储在连续的位置。 顺序和彼此相邻。 通常,以连续顺序检索元素很快,因为您不必花费时间来查找元素,您只知道下一个项目始终是它旁边的下一个位置。 并且因为它知道array.length并可以确定为该数组分配了哪些内存块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM