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 相关文章推荐
出现“不能执行已释放的Script代码”错误的原因及解决办法
Aug 29 Javascript
在jQuery ajax中按钮button和submit的区别分析
Oct 07 Javascript
js 图片随机不定向浮动的实现代码
Jul 02 Javascript
jquery 按键盘上的enter事件
May 11 Javascript
深入分析下javascript中的[]()+!
Jul 07 Javascript
js微信分享API
Oct 11 Javascript
Vue 组件封装 并使用 NPM 发布的教程
Sep 30 Javascript
jquery.pagination.js分页使用教程
Oct 23 jQuery
Vue 后台管理类项目兼容IE9+的方法示例
Feb 20 Javascript
Node.js API详解之 module模块用法实例分析
May 13 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
Aug 17 Javascript
微信小程序自定义tabBar的踩坑实践记录
Nov 06 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
用 PHP5 轻松解析 XML
2006/12/04 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
2013/06/20 PHP
ThinkPHP模板输出display用法分析
2014/11/26 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
文本框获得焦点和失去焦点的判断代码
2012/03/18 Javascript
JSON 数字排序多字段排序介绍
2013/09/18 Javascript
js分页工具实例
2015/01/28 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
JavaScript转换与解析JSON方法实例详解
2015/11/24 Javascript
微信小程序 详解Page中data数据操作和函数调用
2017/01/12 Javascript
Bootstrap面板学习使用
2017/02/09 Javascript
AngularJS2中一种button切换效果的实现方法(二)
2017/03/27 Javascript
JS实现的简单四则运算计算器功能示例
2017/09/27 Javascript
vue-router 中 meta的用法详解
2019/11/01 Javascript
js实现课堂随机点名系统
2019/11/21 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
Python2.5/2.6实用教程 入门基础篇
2009/11/29 Python
python中的lambda表达式用法详解
2016/06/22 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
Python双精度浮点数运算并分行显示操作示例
2017/07/21 Python
Python简单过滤字母和数字的方法小结
2019/01/09 Python
Win10下python 2.7与python 3.7双环境安装教程图解
2019/10/12 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
即时搜索数百万张门票:SeatsForEveryone.com
2018/08/26 全球购物
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
泰国国际航空公司官网:Thai Airways International
2019/12/04 全球购物
致全体运动员广播稿
2014/02/01 职场文书
捐书活动总结
2014/05/04 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书
python开发飞机大战游戏
2021/07/15 Python
nginx配置限速限流基于内置模块
2022/05/02 Servers