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


Posted in Javascript onJuly 07, 2013

之前听说火狐的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,是个很累赘的过程:

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

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

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

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

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

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

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

Javascript 相关文章推荐
node.js正则表达式获取网页中所有链接的代码实例
Jun 03 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
Sep 20 Javascript
关于JS中的apply,call,bind的深入解析
Apr 05 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
May 10 Javascript
Vue.js每天必学之构造器与生命周期
Sep 05 Javascript
js判断价格,必须为数字且不能为负数的实现方法
Oct 07 Javascript
javascript iframe跨域详解
Oct 26 Javascript
详解JS构造函数中this和return
Sep 16 Javascript
Node之简单的前后端交互(实例讲解)
Nov 14 Javascript
小程序实现投票进度条
Nov 20 Javascript
vue中的过滤器及其时间格式化问题
Apr 09 Javascript
javascript使用正则表达式实现注册登入校验
Sep 23 Javascript
JavaScript 上万关键字瞬间匹配实现代码
Jul 07 #Javascript
20行代码实现的一个CSS覆盖率测试脚本
Jul 07 #Javascript
在JavaScript里嵌入大量字符串常量的实现方法
Jul 07 #Javascript
JQuery表格内容过滤的实现方法
Jul 05 #Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
Jul 05 #Javascript
Javascript实现动态菜单添加的实例代码
Jul 05 #Javascript
javascript实现跳转菜单的具体方法
Jul 05 #Javascript
You might like
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
PHP编码规范的深入探讨
2013/06/06 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
CI框架中libraries,helpers,hooks文件夹详细说明
2014/06/10 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
setAttribute 与 class冲突解决
2008/02/17 Javascript
JQuery从头学起第三讲
2010/07/06 Javascript
javascript中call和apply方法浅谈
2013/09/27 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
JS给Array添加是否包含字符串的简单方法
2016/10/29 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
详解如何实现一个简单的Node.js脚手架
2017/12/04 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
python解决字典中的值是列表问题的方法
2013/03/04 Python
Python运用于数据分析的简单教程
2015/03/27 Python
Python实现图片转字符画的示例
2017/08/22 Python
unittest+coverage单元测试代码覆盖操作实例详解
2018/04/04 Python
python用插值法绘制平滑曲线
2021/02/19 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
Python Lambda函数使用总结详解
2019/12/11 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
2020/02/28 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
2020/03/19 Python
《云雀的心愿》教学反思
2014/02/25 职场文书
毕业自我鉴定怎么写
2014/03/25 职场文书
家长建议怎么写
2014/05/15 职场文书
校园环保标语
2014/06/13 职场文书
2015年林业工作总结
2015/05/14 职场文书
大学新生入学感想
2015/08/07 职场文书
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
2021/04/24 Python
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python