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中继承的一些示例方法与属性参考
Aug 07 Javascript
JS实现Select的option上下移动的方法
Mar 01 Javascript
jQuery组件easyui对话框实现代码
Aug 25 Javascript
ionic+AngularJs实现获取验证码倒计时按钮
Apr 22 Javascript
详解vue-router 2.0 常用基础知识点之router-link
May 10 Javascript
Javascript快速实现浏览器系统通知
Aug 26 Javascript
VUE实现一个分页组件的示例
Sep 13 Javascript
vue.js单文件组件中非父子组件的传值实例
Sep 13 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
Feb 03 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
Mar 08 Javascript
微信小程序实现身份证取景框拍摄
Sep 09 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
Oct 14 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 Stream_*系列函数
2010/08/01 PHP
php数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
PHP生成随机用户名和密码的实现代码
2013/02/27 PHP
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
54个提高PHP程序运行效率的方法
2015/07/19 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
2017/10/25 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
一段多浏览器的&quot;复制到剪贴板&quot;javascript代码
2007/03/27 Javascript
(function($){...})(jQuery)的意思
2010/07/22 Javascript
jquery submit ie6下失效的原因分析及解决方法
2013/11/15 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
使用PHP+JavaScript将HTML页面转换为图片的实例分享
2016/04/18 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
详解js跨域请求的两种方式,支持post请求
2018/05/05 Javascript
[01:20]DOTA2上海特级锦标赛现场采访:谁的ID最受青睐
2016/03/25 DOTA
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
Python语言的12个基础知识点小结
2014/07/10 Python
python实现的希尔排序算法实例
2015/07/01 Python
python脚本设置系统时间的两种方法
2016/02/21 Python
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
酒店工作职员求职简历的自我评价
2013/10/23 职场文书
学院书画协会部门岗位职责
2013/12/01 职场文书
上班玩手机检讨书
2014/02/17 职场文书
亚运会口号
2014/06/20 职场文书
办公室岗位职责
2015/02/04 职场文书
高一化学教学反思
2016/02/22 职场文书
Python基础详解之邮件处理
2021/04/28 Python
Python实战之实现简易的学生选课系统
2021/05/25 Python
opencv读取视频并保存图像的方法
2021/06/04 Python