我一直想知道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];
}
答案 0 :(得分:3)
你的问题的答案很简单:因为没有创建in循环来处理数组,并且还做了其他事情而且不应该使用。
for-in语句的主要目的是迭代思想对象的属性,而不是通过数组。这个语句也将进入数组原型链,通过继承属性迭代,我认为你不需要这个,甚至不知道这个。
另一个有趣的事情是,你甚至不知道它将按什么顺序进行迭代。
所以要记住的主要事情 - 不要用于数组。只有对象。
正如RobG正确添加的那样:
如果在阵列上找不到它们,for循环也将在[[Prototype]]链上搜索属性。例如。一个for循环超过[0 ,,,2]将一直搜索到Object.prototype [[Prototype]]
答案 1 :(得分:1)
这里有一些问题。
return
导致循环在第一次迭代后中止,您的测试无用for..in
遍历对象的属性,数组的元素不是它唯一的属性!你是否要添加一个属性,例如a.foo = true
;这将包含在使用for..in
进行迭代但不包含在for
中。请不要使用for..in
来循环数组。不。如初。
答案 2 :(得分:0)
这实际上取决于JavaScript引擎的实现。因为JavaScript是动态类型的,所以解释器必须做一些工作来建立给定变量的类型。我怀疑在使用for ... in时,循环的经典整数迭代器在引擎中有优化。
修改强>
for..in遍历变量的可枚举属性,因此var i被赋予每个循环中数组中每个字符串的值。
答案 3 :(得分:0)
为了解释为什么for
循环比for in
循环更快,基本上理解用于在内存中存储数据的基础数据结构。
由于数组存储在内存中的方式,循环通过基于索引的数组自然更快。它只是内存中的一个位置,数组中的项目存储在连续的位置,也就是说。按顺序和彼此相邻。通常,以连续顺序检索元素是快速的,因为您不必花时间来查找它,您只知道下一个项目始终是它旁边的下一个位置。并且因为它知道array.length
并且可以确定为阵列分配了哪些内存块。