从数据结构的角度分析 for each in 比 for in 快的多

 更新时间:2013年07月07日 23:42:50   作者:  
今天仔细琢磨了会,从数据结构的角度分析了下,觉得for in和for each in效率上有着本质的区别,无论是JS还是AS

之前听说火狐的JS引擎支持for each in的语法,例如下述的代码:

复制代码 代码如下:

var arr = [10,20,30,40,50];
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[1000000]并非真正申请容纳一百万个元素的空间,而是把1000000转换成相应的哈希值,对应到很小一块储存空间里,从而节省了大量内存。
  例如有如下数组:

复制代码 代码如下:

var arr = [];
  arr[10] = 1000;
  arr[20] = 2000;
  arr[30] = 5000;
  arr[40] = 8000;
  arr[200] = 9000;

用for...in遍历Array,是个很累赘的过程:

遍历时每次访问arr[k],都要进行一次Hash(k)计算,根据散列表的容量取模,如果存在冲突还得寻找最终的值结果。

如果支持for each...in的语法,其内部的数据结构就决定了会快很多:

Array里直接把每个values作为节点,通过链表关联起来维护。每当有值添加或删除,就更新其链接关系。
当for each...in遍历时,只需从第一个节点往后迭代即可,无需任何Hash计算。

当然,对于AS3里Vector这样的线性数组来说,两者相差不大;同理,HTML5里支持二进制的数组ArrayBuffer也是如此。不过从理论上来看,即使arr是个连续的线性数组,for each in还是要快一点:

for...in遍历时,每次访问arr[k]都要进行下标越界检查;而for each in则根据内部链表,直接从底层反馈出迭代变量,节省了越界检查的过程。

相关文章

  • js创建表单元素并使用submit进行提交

    js创建表单元素并使用submit进行提交

    这篇文章主要介绍了js创建表单元素并使用submit进行提交,需要的朋友可以参考下
    2014-08-08
  • TopList标签和JavaScript结合两例

    TopList标签和JavaScript结合两例

    TopList标签和JavaScript结合两例...
    2007-08-08
  • 一文详解JavaScript中的Mixin

    一文详解JavaScript中的Mixin

    类的出现最终使JavaScript非常容易使用继承法,JavaScript类比大多数人意识到的更强大,它是构建真正的mixins的良好基础,本文介绍JavaScript中的Mixin介绍的非常详细,需要的小伙伴可以参考阅读一下
    2023-04-04
  • JavaScript实现输入框(密码框)出现提示语

    JavaScript实现输入框(密码框)出现提示语

    有时候我们需要在登陆表单有一些提示语言,比如“请输入用户名”和“请输入密码”等语言,通过本文给大家介绍JavaScript实现输入框(密码框)出现提示语的相关知识,对js实现输入框提示相关知识感兴趣的朋友一起学习吧
    2016-01-01
  • 使用js复制链接中的部分文字的方法

    使用js复制链接中的部分文字的方法

    这篇文章介绍了使用js复制链接中的部分文字的方法,技巧很实用,需要的朋友可以参考下
    2015-07-07
  • 微信中一些常用的js方法汇总

    微信中一些常用的js方法汇总

    本文给大家汇总了一下在我们日常开发微信项目的过程中,经常需要用到的一些js方法,都是些使用频率很高,而且非常简单的方法,这里推荐给大家。
    2015-03-03
  • JS实现点击发送验证码 xx秒后重新发送功能

    JS实现点击发送验证码 xx秒后重新发送功能

    在一些注册类的网站,经常遇到这样的需求,点击发送验证码,xx秒后重新发送,这样的功能怎么实现呢,接下来通过本文给大家分享js点击发送验证码 xx秒后重新发送功能,需要的朋友参考下吧
    2019-07-07
  • js全选按钮的实现方法

    js全选按钮的实现方法

    在我们进行项目选择时,会出现选择多个项目或者是项目实现全选,这样的功能如何实现呐,本文给出了js实现checkbox全选的详细代码,希望大家喜欢。
    2015-11-11
  • 实例讲解JavaScript 计时事件

    实例讲解JavaScript 计时事件

    这篇文章主要介绍了JavaScript 计时事件的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • asp.net+js 实现无刷新上传解析csv文件的代码

    asp.net+js 实现无刷新上传解析csv文件的代码

    无刷新上传解析csv文件的实现代码,需要的朋友可以参考下。
    2010-05-05

最新评论