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----文件操作
Jan 18 Javascript
借用Google的Javascript API Loader来加速你的网站
Jan 28 Javascript
Jquery 滑入滑出效果实现代码
Mar 27 Javascript
javascript 仿QQ滑动菜单效果代码
Sep 03 Javascript
JavaScript性能陷阱小结(附实例说明)
Dec 28 Javascript
js 弹出框只弹一次(二次修改之后的)
Nov 26 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
May 27 Javascript
JS实现title标题栏文字不间断滚动显示效果
Sep 07 Javascript
vue.js 实现点击按钮动态添加li的方法
Sep 07 Javascript
详解jquery和vue对比
Apr 16 jQuery
React+TypeScript+webpack4多入口配置详解
Aug 08 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
Apr 09 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
我的论坛源代码(九)
2006/10/09 PHP
php通过function_exists检测函数是否存在的方法
2015/03/18 PHP
深入理解PHP中的Streams工具
2015/07/03 PHP
制作特殊字的脚本
2006/06/26 Javascript
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
2008/09/08 Javascript
11款基于Javascript的文件管理器
2009/10/25 Javascript
跨浏览器开发经验总结(三)   警惕“IE依赖综合症”
2010/05/13 Javascript
javascript实现限制上传文件大小
2015/02/06 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
2016/05/28 Javascript
原生JS实现导航下拉菜单效果
2020/11/25 Javascript
详解vue-router 2.0 常用基础知识点之router-link
2017/05/10 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
基于Vue生产环境部署详解
2017/09/15 Javascript
详解JSON和JSONP劫持以及解决方法
2019/03/08 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
2019/09/06 Javascript
jQuery实现简单轮播图效果
2020/12/27 jQuery
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
python单元测试unittest实例详解
2015/05/11 Python
Python时间获取及转换知识汇总
2017/01/11 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
StubHub哥伦比亚:购买和出售您的门票
2016/10/20 全球购物
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
Cult Gaia官网:美国生活方式品牌
2019/08/16 全球购物
Java语言程序设计测试题改错题部分
2014/07/22 面试题
大一学生假期实习的自我评价
2013/10/12 职场文书
总务岗位职责
2013/11/19 职场文书
大学生励志演讲稿
2014/04/25 职场文书
数学兴趣小组活动总结
2014/07/08 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
2019初中学生入团申请书
2019/06/27 职场文书
mysql下的max_allowed_packet参数设置详解
2022/02/12 MySQL
Golang 对es的操作实例
2022/04/20 Golang