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 相关文章推荐
用js小类库获取浏览器的高度和宽度信息
Jan 15 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
Nov 25 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
May 10 Javascript
JS获取复选框的值,并传递到后台的实现方法
May 30 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
Aug 19 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
Oct 19 Javascript
JavaScript实现定时页面跳转功能示例
Feb 14 Javascript
Vue2.0表单校验组件vee-validate的使用详解
May 02 Javascript
jQuery ajax动态生成table功能示例
Jun 14 jQuery
angularJS实现不同视图同步刷新详解
Oct 09 Javascript
Vue.Draggable拖拽功能的配置使用方法
Jul 29 Javascript
使用layui前端框架弹出form表单以及提交的示例
Oct 25 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笔记之常用文件操作
2010/10/12 PHP
PHP获取MAC地址的具体实例
2013/12/13 PHP
PHP json_encode() 函数详解及中文乱码问题
2015/11/05 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
PHP实现简单用户登录界面
2019/10/23 PHP
javascript数字时钟示例分享
2014/04/23 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
JavaScript入门基础
2015/08/12 Javascript
详解JS面向对象编程
2016/01/24 Javascript
全面理解闭包机制
2016/07/11 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
微信小程序http连接访问解决方案的示例
2018/11/05 Javascript
python虚拟环境 virtualenv的简单使用
2020/01/21 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
python类继承用法实例分析
2014/10/10 Python
python实现txt文件格式转换为arff格式
2018/05/31 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
基于python操作ES实例详解
2019/11/16 Python
Python dict的常用方法示例代码
2020/06/23 Python
css3 伪元素和伪类选择器详解
2014/09/04 HTML / CSS
Myprotein台湾官方网站:全球领先的运动营养品牌
2018/12/10 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
Ajax请求总共有多少种Callback
2016/07/17 面试题
公司聘任书模板
2014/03/29 职场文书
公司任命书范本
2014/06/04 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
2014年班务工作总结
2014/12/02 职场文书
2014年科普工作总结
2014/12/06 职场文书
消夏晚会主持词
2015/06/30 职场文书
校运会加油稿大全
2015/07/22 职场文书