JS中循环遍历数组的四种方式总结


Posted in Javascript onJanuary 23, 2021

本文比较并总结遍历数组的四种方式:

for 循环:

for (let index=0; index < someArray.length; index++) {
 const elem = someArray[index];
 // ···
}

for-in 循环:

for (const key in someArray) {
 console.log(key);
}

数组方法 .forEach():

someArray.forEach((elem, index) => {
 console.log(elem, index);
});

for-of 循环:

for (const elem of someArray) {
 console.log(elem);
}

for-of 通常是最佳选择。我们会明白原因。

for循环 [ES1]

JavaScript 中的 for 循环很古老,它在 ECMAScript 1 中就已经存在了。for 循环记录 arr 每个元素的索引和值:

const arr = ['a', 'b', 'c'];
arr.prop = 'property value';

for (let index=0; index < arr.length; index++) {
 const elem = arr[index];
 console.log(index, elem);
}

// Output:
// 0, 'a'
// 1, 'b'
// 2, 'c'

for 循环的优缺点是什么?

  • 它用途广泛,但是当我们要遍历数组时也很麻烦。
  • 如果我们不想从第一个数组元素开始循环时它仍然很有用,用其他的循环机制很难做到这一点。

for-in循环 [ES1]

for-in 循环与 for 循环一样古老,同样在 ECMAScript 1中就存在了。下面的代码用 for-in 循环输出 arr 的 key:

const arr = ['a', 'b', 'c'];
arr.prop = 'property value';

for (const key in arr) {
 console.log(key);
}

// Output:
// '0'
// '1'
// '2'
// 'prop'

for-in 不是循环遍历数组的好方法:

  • 它访问的是属性键,而不是值。
  • 作为属性键,数组元素的索引是字符串,而不是数字。
  • 它访问的是所有可枚举的属性键(自己的和继承的),而不仅仅是 Array 元素的那些。

for-in 访问继承属性的实际用途是:遍历对象的所有可枚举属性。

数组方法.forEach()[ES5]

鉴于 for 和 for-in 都不特别适合在数组上循环,因此在 ECMAScript 5 中引入了一个辅助方法:Array.prototype.forEach():

const arr = ['a', 'b', 'c'];
arr.prop = 'property value';

arr.forEach((elem, index) => {
 console.log(elem, index);
});

// Output:
// 'a', 0
// 'b', 1
// 'c', 2

这种方法确实很方便:它使我们无需执行大量操作就能够可访问数组元素和索引。如果用箭头函数(在ES6中引入)的话,在语法上会更加优雅。

.forEach() 的主要缺点是:

  • 不能在它的循环体中使用 await。
  • 不能提前退出 .forEach() 循环。而在 for 循环中可以使用 break。

中止 .forEach() 的解决方法

如果想要中止 .forEach() 之类的循环,有一种解决方法:.some() 还会循环遍历所有数组元素,并在其回调返回真值时停止。

const arr = ['red', 'green', 'blue'];
arr.some((elem, index) => {
 if (index >= 2) {
 return true; // 中止循环
 }
 console.log(elem);
 //此回调隐式返回 `undefined`,这
 //是一个伪值。 因此,循环继续。
});

// Output:
// 'red'
// 'green'

可以说这是对 .some() 的滥用,与 for-of 和 break 比起来,要理解这段代码并不容易。

for-of循环 [ES6]

for-of 循环在 ECMAScript 6 开始支持:

const arr = ['a', 'b', 'c'];
arr.prop = 'property value';

for (const elem of arr) {
 console.log(elem);
}
// Output:
// 'a'
// 'b'
// 'c'

for-of 在循环遍历数组时非常有效:

用来遍历数组元素。

可以使用 await

  • 如果有需要,可以轻松地迁移到 for-await-of。

甚至可以将 break 和 continue 用于外部作用域。

for-of 和可迭代对象

for-of 不仅可以遍历数组,还可以遍历可迭代对象,例如遍历 Map:

const myMap = new Map()
 .set(false, 'no')
 .set(true, 'yes')
;
for (const [key, value] of myMap) {
 console.log(key, value);
}

// Output:
// false, 'no'
// true, 'yes'

遍历 myMap 会生成 [键,值] 对,可以通过对其进行解构来直接访问每一对数据。

for-of 和数组索引

数组方法 .entries() 返回一个可迭代的 [index,value] 对。如果使用 for-of 并使用此方法进行解构,可以很方便地访问数组索引:

const arr = ['chocolate', 'vanilla', 'strawberry'];

for (const [index, elem] of arr.entries()) {
 console.log(index, elem);
}
// Output:
// 0, 'chocolate'
// 1, 'vanilla'
// 2, 'strawberry'

总结

for-of 循环的的可用性比 for,for-in 和 .forEach() 更好。

通常四种循环机制之间的性能差异应该是无关紧要。如果你要做一些运算量很大的事,还是切换到 WebAssembly 更好一些。

到此这篇关于JS中循环遍历数组的四种方式总结的文章就介绍到这了,更多相关JS循环遍历数组内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
Jun 26 Javascript
类似php的js数组的in_array函数自定义方法
Dec 27 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
Mar 26 Javascript
原生javascript实现图片无缝滚动效果
Feb 12 Javascript
jQuery each函数源码分析
May 25 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
Jul 08 Javascript
javascript中href和replace的比较(详解)
Nov 25 Javascript
深入理解ES6中let和闭包
Feb 22 Javascript
vue.js中ref和$refs的使用及示例讲解
Aug 14 Javascript
JavaScript判断数组类型的方法
Oct 23 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
Nov 12 Javascript
Jquery Datatables的使用详解
Jan 30 jQuery
vue form表单post请求结合Servlet实现文件上传功能
Jan 22 #Vue.js
原生js实现自定义难度的扫雷游戏
Jan 22 #Javascript
Element-ui upload上传文件限制的解决方法
Jan 22 #Javascript
js canvas实现五子棋小游戏
Jan 22 #Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 #Vue.js
element-ui 弹窗组件封装的步骤
Jan 22 #Javascript
动态实现element ui的el-table某列数据不同样式的示例
Jan 22 #Javascript
You might like
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
要会喝咖啡也要会知道咖啡豆
2021/03/03 咖啡文化
php 移除数组重复元素的一点说明
2008/11/27 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
php简单的上传类分享
2016/05/15 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
Apache站点配置SSL强制跳转443
2021/03/09 Servers
jQuery 位置插件
2008/12/25 Javascript
javascript数字格式化通用类 accounting.js使用
2012/08/24 Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
2014/02/07 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
javascript实现类似java中getClass()得到对象类名的方法
2015/07/27 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
Python  pip安装lxml出错的问题解决办法
2017/02/10 Python
OpenCV实现人脸识别
2017/04/07 Python
python实现简单tftp(基于udp协议)
2018/07/30 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
python定义类self用法实例解析
2020/01/22 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
css3动画效果小结(推荐)
2016/07/25 HTML / CSS
生产副总岗位职责
2013/11/28 职场文书
毕业生求职自荐信怎么写
2014/01/08 职场文书
教师演讲稿开场白
2014/08/25 职场文书
反腐倡廉观后感
2015/06/08 职场文书
学生会工作感言
2015/08/07 职场文书
医院病假条范文
2015/08/17 职场文书
人身损害赔偿协议书
2016/03/22 职场文书