从数据结构分析看:用for each...in 比 for...in 要快些

 更新时间:2013年04月17日 11:21:34   作者:  
本篇文章小编将为大家介绍,从数据结构分析看:用for each...in 比 for...in 要快些。需要的朋友可以参考一下

之前听说火狐的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里储存存了keys的列表,也把每个values值作为链表关联起来。每当有值添加或删除,就更新其链接关系。

当for each...in遍历时,只需从第一个节点往后迭代即可,无需任何Hash计算。

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

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

相关文章

  • JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)

    JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)

    这篇文章主要介绍了JavaScript字符串对象的concat方法实例,这个方法用于连接两个或多个字符串,平时用+号比较多,所以这个方法可能不太常用,需要的朋友可以参考下
    2014-10-10
  • javascript学习笔记(十四) window对象使用介绍

    javascript学习笔记(十四) window对象使用介绍

    javascript学习笔记之window对象使用介绍,需要的朋友可以参考下
    2012-06-06
  • JavaScript判断IE版本型号

    JavaScript判断IE版本型号

    JavaScript判断IE版本号,很简单,需要的朋友可以参考下
    2015-07-07
  • 完全不用基础的HTML5入门篇教程

    完全不用基础的HTML5入门篇教程

    HTML的全称为超文本标记语言,是一种标记语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字,图形、动画、声音、表格、链接等
    2022-03-03
  • JS 实现计算器详解及实例代码(一)

    JS 实现计算器详解及实例代码(一)

    这篇文章主要介绍了JS 实现计算器详解及实例代码的相关资料,这里对实现计算器的思路及实现步骤进行了一一详解,需要的朋友可以参考下
    2017-01-01
  • TypeScrip中泛型的案例详解

    TypeScrip中泛型的案例详解

    这篇文章主要介绍了TypeScrip中泛型的案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • Javascript基础:运算符与流程控制详解

    Javascript基础:运算符与流程控制详解

    这篇文章主要给大家介绍了关于Javascript中运算符及流程控制的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-10-10
  • 深入理解javascript作用域和闭包

    深入理解javascript作用域和闭包

    作用域和作用域链是javascript中非常重要的特性,对于他们的理解直接关系到对于整个javascript体系的理解,而闭包又是对作用域的延伸,也是在实际开发中经常使用的一个特性,实际上,不仅仅是javascript,在很多语言中都提供了闭包的特性。
    2014-09-09
  • JSON语法五大要素图文介绍

    JSON语法五大要素图文介绍

    JSON语法是一种轻量级的数据交换格式,易于人阅读和编写本文将详细介绍,需要了解的朋友可以参考下
    2012-12-12
  • JavaScript的对象和包装类你了解多少

    JavaScript的对象和包装类你了解多少

    这篇文章主要为大家详细介绍了JavaScript的对象和包装类,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论