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中匿名函数的多种调用方式总结
Dec 06 Javascript
判断及设置浏览器全屏模式
Apr 20 Javascript
jquery中获得元素尺寸和坐标的方法整理
May 18 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
May 01 Javascript
全面解析Bootstrap中transition、affix的使用方法
May 30 Javascript
JS从数组中随机取出几个数组元素的方法
Aug 02 Javascript
详细总结Javascript中的焦点管理
Sep 17 Javascript
移动端点击态处理的三种实现方式
Jan 12 Javascript
微信小程序实现给循环列表添加点击样式实例
Apr 26 Javascript
JavaScript基础心法 数据类型
Mar 05 Javascript
jQuery实现动态添加和删除input框实例代码
Mar 26 jQuery
jQuery实现鼠标滑动切换图片
May 27 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
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
ThinkPHP函数详解之M方法和R方法
2015/09/10 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
2018/05/21 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
JavaScript中常见的字符串操作函数及用法汇总
2015/05/04 Javascript
javascript中mouseover、mouseout使用详解
2015/07/19 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
浅析JavaScript异步代码优化
2019/03/18 Javascript
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
Python 忽略warning的输出方法
2018/10/18 Python
python简单贪吃蛇开发
2019/01/28 Python
Python父目录、子目录的相互调用方法
2019/02/16 Python
Django 内置权限扩展案例详解
2019/03/04 Python
详解Python绘图Turtle库
2019/10/12 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
python实现翻译word表格小程序
2020/02/27 Python
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
Probikekit欧盟:在线公路自行车专家
2019/07/12 全球购物
Bravofly德国:预订廉价航班和酒店
2019/09/22 全球购物
介绍一下Linux中的链接
2016/06/05 面试题
药剂专业自荐信范文
2014/04/16 职场文书
舌尖上的中国观后感
2015/06/02 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
孩子满月酒答谢词
2015/09/30 职场文书
初中数学教学反思范文
2016/02/17 职场文书
有关保护环境的宣传标语100条
2019/08/07 职场文书
Python实现制作销售数据可视化看板详解
2021/11/27 Python