JS常用的几种数组遍历方式以及性能分析对比实例详解


Posted in Javascript onApril 11, 2018

本文实例讲述了JS常用的几种数组遍历方式以及性能分析对比。分享给大家供大家参考,具体如下:

前言

这一篇与上一篇 JS几种变量交换方式以及性能分析对比 属于同一个系列,本文继续分析JS中几种常用的数组遍历方式以及各自的性能对比

起由

在上一次分析了JS几种常用变量交换方式以及各自性能后,觉得这种方式挺好的,于是抽取了核心逻辑,封装成了模板,打算拓展成一个系列,本文则是系列中的第二篇,JS数组遍历方式的分析对比

JS数组遍历的几种方式

JS数组遍历,基本就是for,forin,foreach,forof,map等等一些方法,以下介绍几种本文分析用到的数组遍历方式以及进行性能分析对比

第一种:普通for循环

代码如下:

for(j = 0; j < arr.length; j++) {
}

简要说明: 最简单的一种,也是使用频率最高的一种,虽然性能不弱,但仍有优化空间

第二种:优化版for循环

代码如下:

for(j = 0,len=arr.length; j < len; j++) {
}

简要说明: 使用临时变量,将长度缓存起来,避免重复获取数组长度,当数组较大时优化效果才会比较明显。

这种方法基本上是所有循环遍历方法中性能最高的一种

第三种:弱化版for循环

代码如下:

for(j = 0; arr[j]!=null; j++) {
}

简要说明: 这种方法其实严格上也属于for循环,只不过是没有使用length判断,而使用变量本身判断

实际上,这种方法的性能要远远小于普通for循环

第四种:foreach循环

代码如下:

arr.forEach(function(e){
});

简要说明: 数组自带的foreach循环,使用频率较高,实际上性能比普通for循环弱

第五种:foreach变种

代码如下:

Array.prototype.forEach.call(arr,function(el){
});

简要说明: 由于foreach是Array型自带的,对于一些非这种类型的,无法直接使用(如NodeList),所以才有了这个变种,使用这个变种可以让类似的数组拥有foreach功能。

实际性能要比普通foreach弱

第六种:forin循环

代码如下:

for(j in arr) {
}

简要说明: 这个循环很多人爱用,但实际上,经分析测试,在众多的循环遍历方式中

它的效率是最低的

第七种:map遍历

代码如下:

arr.map(function(n){
});

简要说明: 这种方式也是用的比较广泛的,虽然用起来比较优雅,但实际效率还比不上foreach

第八种:forof遍历(需要ES6支持)

代码如下:

for(let value of arr) {
});

简要说明: 这种方式是es6里面用到的,性能要好于forin,但仍然比不上普通for循环

各种遍历方式的性能对比

上述列举了几种方式都有一一做过对比分析,基本上可以得出的结论是:

普通for循环才是最优雅的

(PS:以上所有的代码都只是进行空的循环,没有再循环内部执行代码,仅仅是分析各自循环的时间而已)

性能对比截图

分析结果1

以下截图中的数据是,在chrome (支持es6)中运行了100次后得出的结论(每次运行10次,一共10个循环,得到的分析结果)

 JS常用的几种数组遍历方式以及性能分析对比实例详解

可以看出,forin循环最慢。优化后的普通for循环最快

分析结果2

以下截图数据是,在chrome (支持es6)中运行了1000次后得出的结论(每次运行100次,一共10个循环,得到的分析结果)

 JS常用的几种数组遍历方式以及性能分析对比实例详解

另外,可使用如下demo中可以使用分析工具进行 JS数组遍历方式分析对比

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript XML操作 封装类
Jul 01 Javascript
ext 代码生成器
Aug 07 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
Jan 15 Javascript
JavaScript学习心得之概述
Jan 20 Javascript
js实现类似MSN提示的页面效果代码分享
Aug 24 Javascript
js获取页面引用的css样式表中的属性值方法(推荐)
Aug 19 Javascript
js实现加载页面就自动触发超链接的示例
Aug 31 Javascript
webpack结合express实现自动刷新的方法
May 07 Javascript
JavaScript判断对象和数组的两种方法
May 31 Javascript
AntV F2和vue-cli构建移动端可视化视图过程详解
Oct 08 Javascript
JavaScript复制变量三种方法实例详解
Jan 09 Javascript
JQuery使用数组遍历跳出each循环
Sep 01 jQuery
node结合swig渲染摸板的方法
Apr 11 #Javascript
详解react、redux、react-redux之间的关系
Apr 11 #Javascript
Mac下安装vue
Apr 11 #Javascript
vue-cli 组件的导入与使用教程详解
Apr 11 #Javascript
手动用webpack搭建第一个ReactApp的示例
Apr 11 #Javascript
浅谈vue-cli 3.0.x 初体验
Apr 11 #Javascript
vue 组件高级用法实例详解
Apr 11 #Javascript
You might like
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
PHP生成指定长度随机数最简洁的方法
2014/07/14 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
Yii基于数组和对象的Model查询技巧实例详解
2015/12/28 PHP
PHP中字符串长度的截取用法示例
2017/01/12 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
JS仿flash上传头像效果实现代码
2011/07/18 Javascript
JavaScript初学者应注意的七个细节小结
2012/01/30 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
javascript实现捕捉键盘上按下的键
2015/05/05 Javascript
jQuery仿gmail实现fixed布局的方法
2015/05/27 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
Angular 理解module和injector,即依赖注入
2016/09/07 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
2016/10/11 Javascript
基于JavaScript定位当前的地理位置
2017/04/11 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
Vue 过滤器filters及基本用法
2017/12/26 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
2018/03/01 Javascript
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
2019/01/23 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
vue同个按钮控制展开和折叠同个事件操作
2020/07/29 Javascript
python黑魔法之编码转换
2016/01/25 Python
在python里从协程返回一个值的示例
2019/02/19 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
2019/07/31 Python
Python 中pandas索引切片读取数据缺失数据处理问题
2019/10/09 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
枚举与#define宏的区别
2014/04/30 面试题
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
实习报告评语
2014/04/26 职场文书
2014年老干部工作总结
2014/11/21 职场文书
档案管理员岗位职责
2015/02/12 职场文书
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android