[英]Why is looping through an Array so much faster than JavaScript's native `indexOf`?
[英]Why are for..in faster than for loops when looping through an array
您的问题的答案很简单:for in循环不是为处理数组而创建的,它还会执行其他操作,因此不应使用。
for-in语句的主要目的是迭代思想对象的属性,而不是通过数组。 该语句还将进入数组原型链,通过继承的属性进行迭代,我认为您不需要此甚至不知道。
您甚至不知道会以什么顺序进行迭代的另一件有趣的事情。
因此,要记住的主要事情-请勿用于in数组。 仅与对象。
PS作为RobG正确添加:
如果在数组中找不到属性,则for循环也会在[[Prototype]]链上搜索属性。 例如,在[0,,2]上的for循环将一直搜索1直到Object.prototype [[Prototype]]
这里有几处错误。
return
导致循环在第一次迭代后中止,您的测试无用 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.