从数据结构的角度分析 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 相关文章推荐
JavaScript 设计模式 富有表现力的Javascript(一)
May 26 Javascript
JQuery与Ajax调用新浪API获取短网址的代码
Feb 07 Javascript
浅析JS中document对象的一些重要属性
Mar 06 Javascript
jquery的trigger和triggerHandler的区别示例介绍
Apr 20 Javascript
Jquery使用小技巧汇总
Dec 29 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
May 13 Javascript
javascript实现任务栏消息提示的简单实例
May 31 Javascript
最棒的Angular2表格控件
Aug 10 Javascript
JavaScript实现通过select标签跳转网页的方法
Sep 29 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
Jan 25 Javascript
推荐15个最好用的JavaScript代码压缩工具
Feb 13 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
Aug 06 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
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
PHP实现判断数组是一维、二维或几维的方法
2017/02/06 PHP
Discuz! 6.1_jQuery兼容问题
2008/09/23 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
2011/10/29 Javascript
js确定对象类型方法
2012/03/30 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
jQuery无刷新切换主题皮肤实例讲解
2015/10/21 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
JS获取指定月份的天数两种实现方法
2018/06/22 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
vue iview实现动态新增和删除
2020/06/17 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
Python中的super()方法使用简介
2015/08/14 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
Python实现简单求解给定整数的质因数算法示例
2018/03/25 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
python基础教程之while循环
2019/08/14 Python
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
意大利拉斐尔时尚购物网:Raffaello Network(支持中文)
2018/11/09 全球购物
Swanson中国官网:美国斯旺森健康产品公司
2021/03/01 全球购物
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
公司市场部岗位职责
2013/12/02 职场文书
英语系本科生求职信范文
2013/12/18 职场文书
纪念建党演讲稿范文
2014/01/13 职场文书
简历自我评价模板
2015/03/11 职场文书
研讨会通知
2015/04/27 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
2016年教师节慰问信
2015/12/01 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书