从数据结构的角度分析 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 相关文章推荐
jQuery操作select的实例代码
Jun 14 Javascript
Jquery实现显示和隐藏的4种简单方式
Aug 28 Javascript
jQuery 隐藏和显示 input 默认值示例
Jun 03 Javascript
快速学习AngularJs HTTP响应拦截器
Dec 31 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
Mar 10 Javascript
jQuery实现的模拟弹出窗口功能示例
Nov 24 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
Jan 23 Javascript
分享一个精简的vue.js 图片lazyload插件实例
Mar 13 Javascript
Gulp实现静态网页模块化的方法详解
Jan 09 Javascript
JavaScript 有用的代码片段和 trick
Feb 22 Javascript
vue-cli 引入、配置axios的方法
May 08 Javascript
Layui实现带查询条件的分页
Jul 27 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中在数据库中保存Checkbox数据(1)
2006/10/09 PHP
PHP中用正则表达式清除字符串的空白
2011/01/17 PHP
php 无限级分类 获取顶级分类ID
2016/03/13 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
2018/04/20 PHP
JavaScript的面向对象方法以及差别
2008/03/31 Javascript
地震发生中逃生十大法则
2008/05/12 Javascript
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
DOM基础教程之使用DOM
2015/01/19 Javascript
JS访问SWF的函数用法实例
2015/07/01 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
4个顶级开源JavaScript图表库
2018/09/29 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
jquery自定义组件实例详解
2020/12/31 jQuery
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
python正则表达式re模块详细介绍
2014/05/29 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
2020/01/18 Python
Python类中self参数用法详解
2020/02/13 Python
python 代码运行时间获取方式详解
2020/09/18 Python
普罗米修斯教学反思
2014/02/06 职场文书
春季防火方案
2014/05/10 职场文书
2014群众路线学习笔记
2014/11/06 职场文书
坎儿井导游词
2015/02/09 职场文书
小学教师读书笔记
2015/07/01 职场文书
2016年元旦寄语
2015/08/17 职场文书
小学三年级数学教学反思
2016/02/16 职场文书
如何使用JavaScript策略模式校验表单
2021/04/29 Javascript