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 相关文章推荐
js遍历td tr等html元素
Dec 13 Javascript
js中document.write使用过程中的一点疑问解答
Mar 20 Javascript
jQuery实现html元素拖拽
Jul 21 Javascript
JS获取复选框的值,并传递到后台的实现方法
May 30 Javascript
js替换字符串中所有指定的字符(实现代码)
Aug 17 Javascript
React Router基础使用
Jan 17 Javascript
node.js中EJS 模板快速入门教程
May 08 Javascript
js+html5实现侧滑页面效果
Jul 15 Javascript
bootstrap-Treeview实现级联勾选
Nov 23 Javascript
微信小程序云开发之数据库操作
May 18 Javascript
JS实现关闭小广告特效
Jan 29 Javascript
详解基于element的区间选择组件校验(交易金额)
Jan 07 Javascript
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
php生成zip压缩文件的方法详解
2013/06/09 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
2017/04/05 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
使用XHProf查找PHP性能瓶颈的实例
2017/12/13 PHP
jquery蒙版控件实现代码
2010/12/08 Javascript
Dom 学习总结以及实例的使用介绍
2013/04/24 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
2016/05/30 Javascript
PHP+jquery+ajax实现分页
2016/12/09 Javascript
微信小程序 地图map实例详解
2017/06/07 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
JavaScript原型式继承实现方法
2019/11/06 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
[52:31]VP vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python使用nntp读取新闻组内容的方法
2015/05/08 Python
深入理解python中的select模块
2017/04/23 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
2018/12/17 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
查看keras的默认backend实现方式
2020/06/19 Python
英国厨房与餐具用品为主的设计品牌:Joseph Joseph
2018/04/26 全球购物
Ajax的优点和缺点
2014/11/21 面试题
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
学生思想表现的评语
2014/01/30 职场文书
公司年会抽奖活动主持词
2014/03/31 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书
2014年采购员工作总结
2014/11/18 职场文书
拾金不昧表扬信
2015/01/16 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
唐山大地震的观后感
2015/06/05 职场文书
导游词之苏州寒山寺
2019/12/05 职场文书
《月歌。》宣布制作10周年纪念剧场版《RABBITS KINGDOM THE MOVIE》
2022/04/02 日漫