听说火狐的JS引擎支持每个in的语法,比如下面的代码:复制代码如下:var arr=[10,20,30,40,50];对于每个(arr中的var k)console . log(k);您可以直接遍历arr数组的内容。因为只有FireFox支持,所以几乎所有的JS代码都不使用这个功能。然而,在ActionScript中,自然支持每个脚本的语法。无论是数组、向量还是字典,只要是可枚举对象,都可以在中形成,也可以在每个中形成。之前没觉得有太大区别,就用熟悉的for in遍历,避免每个字都打出来。但是,从数据结构的角度仔细考虑和分析后,我认为for in和for各自在效率上是有本质区别的,无论是JS还是AS。原因很简单:数组不是真数组!什么是真正的数组?当然是传统语言中type[]定义的数据类型,所有元素都是连续保存的。虽然“Array”也是数组的意思,但是熟悉JS的人都知道,它其实是一个非线性伪数组,下标可以是任意数字。写arr [1,000,000]并不是真的申请100万个元素的空间,而是将1,000,000转换成对应的哈希值,对应的存储空间很小,从而节省了大量的内存。比如有以下数组:复制代码如下: var arr=[];arr[10]=1000;arr[20]=2000;arr[30]=5000;arr[40]=8000;arr[200]=9000;带有for的遍历数组.in是一个繁琐的过程:。
遍历时,每次访问arr[k]都需要进行Hash(k)计算,根据哈希表的容量取模,如果有冲突就求最终的值结果。如果“对于每个.在“是支持的,它的内部数据结构决定了它会快很多:。
在Array中,每个值被直接视为一个节点,由链表维护。每当添加或删除值时,其链接关系都会更新。每一个的时间.在遍历中,它只需要从第一个节点迭代回来,不需要任何Hash计算。当然,对于像AS3中的Vector这样的线性阵列来说,它们之间几乎没有区别。同样,支持HTML5二进制的ArrayBuffer也是如此。然而,理论上,即使arr是一个连续线性阵列,对于每一个in来说都应该更快:当for.在遍历中,每次访问arr[k]都应该检查下标是否越界;而对于每一个in则根据内部链表直接从底层反馈迭代变量,从而节省了越界检查的过程。