从数据结构的角度分析 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 相关文章推荐
广告显示判断
Aug 31 Javascript
动态修改DOM 里面的 id 属性的弊端分析
Sep 03 Javascript
javascript 混合的构造函数和原型方式,动态原型方式
Dec 07 Javascript
node.js中的fs.rmdirSync方法使用说明
Dec 16 Javascript
提升jQuery的性能需要做好七件事
Jan 11 Javascript
Node.js+Express配置入门教程
May 19 Javascript
js中获取时间new Date()的全面介绍
Jun 20 Javascript
BootStrap Typeahead自动补全插件实例代码
Aug 10 Javascript
vue使用ElementUI时导航栏默认展开功能的实现
Jul 04 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
Sep 18 Javascript
详解vue几种主动刷新的方法总结
Feb 19 Javascript
利用Electron简单撸一个Markdown编辑器的方法
Jun 10 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语法速查表
2006/12/06 PHP
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
php使用parse_str实现查询字符串解析到变量中的方法
2017/02/17 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
网页常用特效代码整理
2006/06/23 Javascript
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
js返回上一页并刷新的多种实现方法
2014/02/26 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
简单的分页代码js实现
2016/05/17 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
assert()函数用法总结(推荐)
2017/01/25 Javascript
微信小程序获取微信运动步数的实例代码
2017/07/20 Javascript
Thinkjs3新手入门之如何使用静态资源目录
2017/12/06 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
Django在Win7下的安装及创建项目hello word简明教程
2014/07/14 Python
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
python检查指定文件是否存在的方法
2015/07/06 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
CSS3实现任意图片lowpoly动画效果实例
2017/05/11 HTML / CSS
HTML5的结构和语义(2):结构
2008/10/17 HTML / CSS
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
自荐信格式技巧有哪些呢
2013/11/19 职场文书
测试工程师程序员求职信范文
2014/02/20 职场文书
经济管理自荐书
2014/06/09 职场文书
学用政策心得体会
2014/09/10 职场文书
国家助学金感谢信
2015/01/21 职场文书
围城读书笔记
2015/06/26 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书