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 相关文章推荐
javascript中方便增删改cookie的一个类
Oct 11 Javascript
extjs 04_grid 单击事件新发现
Nov 27 Javascript
javascript firefox 自动加载iframe 自动调整高宽示例
Aug 27 Javascript
jquery实现动态菜单的实例代码
Nov 28 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
Jun 10 Javascript
JScript中的条件注释详解
Apr 24 Javascript
JS实现自动定时切换的简洁网页选项卡效果
Oct 13 Javascript
AngularJS开发教程之控制器之间的通信方法分析
Dec 25 Javascript
JavaScript实现翻页功能(附效果图)
Feb 16 Javascript
vue项目中使用axios上传图片等文件操作
Nov 02 Javascript
vue实现通讯录功能
Jul 14 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
Mar 06 Javascript
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
社区(php&amp;&amp;mysql)一
2006/10/09 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
php使用mysqli向数据库添加数据的方法
2015/03/20 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
JavaScript表单常用验证集合
2008/01/16 Javascript
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
javascript下数值型比较难点说明
2010/06/07 Javascript
判断ie的两种简单方法
2013/08/12 Javascript
javaScript使用EL表达式的几种方式
2014/05/27 Javascript
js创建对象的方式总结
2015/01/10 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
vue头部导航动态点击处理方法
2018/11/02 Javascript
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
jQuery实现鼠标移入显示蒙版效果
2020/01/11 jQuery
Javascript操作select控件代码实例
2020/02/14 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
JavaScript实现京东快递单号查询
2020/11/30 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
详解Python3中的Sequence type的使用
2015/08/01 Python
python 调用c语言函数的方法
2017/09/29 Python
python使用jieba实现中文分词去停用词方法示例
2018/03/11 Python
python实现微信自动回复功能
2018/04/11 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
Python xlrd模块导入过程及常用操作
2020/06/10 Python
好学生评语大全
2014/05/05 职场文书
微笑服务演讲稿
2014/05/13 职场文书
停车位租赁协议书
2014/09/24 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js