为什么在循环数组时比for循环更快

时间:2013-03-07 23:14:42

标签: javascript arrays performance for-loop

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

我使用jsperf对此进行了测试。

我的For循环有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];
}

4 个答案:

答案 0 :(得分:3)

你的问题的答案很简单:因为没有创建in循环来处理数组,并且还做了其他事情而且不应该使用。

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

另一个有趣的事情是,你甚至不知道它将按什么顺序进行迭代。

所以要记住的主要事情 - 不要用于数组。只有对象。

正如RobG正确添加的那样:

  

如果在阵列上找不到它们,for循环也将在[[Prototype]]链上搜索属性。例如。一个for循环超过[0 ,,,2]将一直搜索到Object.prototype [[Prototype]]

答案 1 :(得分:1)

这里有一些问题。

  1. 循环体中的return导致循环在第一次迭代后中止,您的测试无用
  2. for..in遍历对象的属性,数组的元素不是它唯一的属性!你是否要添加一个属性,例如a.foo = true;这将包含在使用for..in进行迭代但不包含在for中。
  3. 请不要使用for..in来循环数组。不。如初。

答案 2 :(得分:0)

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

修改

for..in遍历变量的可枚举属性,因此var i被赋予每个循环中数组中每个字符串的值。

答案 3 :(得分:0)

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