今天仔细琢磨了会
从数据结构的角度分析了下
觉得for in和for each in效率上有着本质的区别
无论是JS还是AS
之前听说火狐的JS引擎支持for each in的语法例如下述的代码
复制代码 代码如下:
var arr = [
];
for each(var k in arr)
console
log(k);
即可直接遍历出arr数组的内容
由于只有FireFox才支持所以几乎所有的JS代码都不用这一特征
不过在ActionScript里天生就支持for each的语法不论Array还是Vector还是Dictionary只要是可枚举的对象都可以for in和for each in
之前并没有感觉有太大的差异为了懒得敲一个each单词一直用熟悉的for in来遍历
不过今天仔细琢磨了会从数据结构的角度分析了下觉得for in和for each in效率上有着本质的区别无论是JS还是AS
原因很简单Array不是真正意义上的数组!
何为真正意义的数组?当然就是传统语言里type[]定义的数据类型所有元素都是连续保存的
“Array”虽然也是数组的意思但熟悉JS的都知道它其实是个非线性的伪数组下标可以是任意数字写入arr[]并非真正申请容纳一百万个元素的空间而是把转换成相应的哈希值对应到很小一块储存空间里从而节省了大量内存
例如有如下数组
复制代码 代码如下:
var arr = [];
arr[
] =
;
arr[
] =
;
arr[
] =
;
arr[
] =
;
arr[
] =
;
用forin遍历Array是个很累赘的过程
遍历时每次访问arr[k]都要进行一次Hash(k)计算根据散列表的容量取模如果存在沖突还得寻找最终的值结果
如果支持for eachin的语法其内部的数据结构就决定了会快很多
Array里直接把每个values作为节点通过链表关联起来维护每当有值添加或删除就更新其链接关系
当for eachin遍历时只需从第一个节点往后迭代即可无需任何Hash计算
当然对于AS里Vector这样的线性数组来说两者相差不大同理HTML里支持二进制的数组ArrayBuffer也是如此不过从理论上来看即使arr是个连续的线性数组for each in还是要快一点
forin遍历时每次访问arr[k]都要进行下标越界检查而for each in则根据内部链表直接从底层反馈出迭代变量节省了越界检查的过程