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技巧
Dec 06 Javascript
Extjs4.0 ComboBox如何实现三级联动
May 11 Javascript
第一次接触神奇的Bootstrap表单
Jul 27 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
Oct 31 Javascript
jquery广告无缝轮播实例
Jan 05 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
Mar 14 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
Jul 10 jQuery
vue获取DOM元素并设置属性的两种实现方法
Sep 30 Javascript
Vue中封装input组件的实例详解
Oct 17 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
Apr 30 Javascript
jquery实现垂直手风琴菜单
Mar 04 jQuery
javascript前端实现多视频上传
Dec 13 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
实现 win2003 下 mysql 数据库每天自动备份
2006/12/06 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
php 人员权限管理(RBAC)实例(推荐)
2017/05/24 PHP
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
2014/04/14 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
inquirer.js一个用户与命令行交互的工具详解
2019/05/18 Javascript
layui实现三级导航菜单
2019/07/26 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
python迭代器的使用方法实例
2013/11/21 Python
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
python分析apache访问日志脚本分享
2015/02/26 Python
Python变量赋值的秘密分享
2018/04/03 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
Python实现的特征提取操作示例
2018/12/03 Python
Python设计模式之建造者模式实例详解
2019/01/17 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
2020/07/13 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
优秀毕业生求职信范文
2014/01/02 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
详解MongoDB的条件查询和排序
2021/06/23 MongoDB
SpringBoot2零基础到精通之数据与页面响应
2022/03/22 Java/Android
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers