浅谈 Javascript 中的 forEach 和 map 之间的区别

简介: 在 Javascript 中数组的迭代最常用的两个函数:forEach和map。可能很多人认为这两个函数在工作方式上是相同的,它们都进行迭代并输出数组的每一项。本文就来介绍一下forEach和map的差异,并因此加深对两个函数的理解。

image.png

在 Javascript 中数组的迭代最常用的两个函数:forEachmap。可能很多人认为这两个函数在工作方式上是相同的,它们都进行迭代并输出数组的每一项。本文就来介绍一下forEachmap的差异,并因此加深对两个函数的理解。

forEach

forEach方法是一个高阶函数,因为它接受回调作为它的参数。它用于遍历数组元素,并且返回undefined。回调函数接受三个参数(元素、值和索引)。

来看下面的代码示例:

const arrAges = [10, 20, 30, 40];// ES5:const es5Result = arrAges.forEach(function (item) {    return item * 2;});console.log(es5Result); // undefinedconsole.log(arrAges); // [ 10, 20, 30, 40 ]// ES6:const es6Result = arrAges.forEach((item) => item * 2);console.log(es6Result); // undefinedconsole.log(arrAges); // [ 10, 20, 30, 40 ]

复制代码

从执行的结果来看,上面的 forEach 函数执行的结果打印出来的都是undefined,执行完后并没有对数组 arrAges 进行任何改动。

forEach函数不接受将其他方法附加到它。 看下面的示例:

const es6Result = arrAges.forEach((item) => item * 2).reduce((a, b) => a + b);// 异常,Cannot read property 'reduce' of undefinedconsole.log(es6Result);

复制代码

map

map 函数用于遍历数组元素。它接受一个回调函数作为参数,根据回调函数返回一个新数组和新元素。

回调函数接受三个参数(元素、值和索引)。

来看下面的代码示例:

const arrAges = [10, 20, 30, 40];// ES5:const es5Result = arrAges.map(function (item) {    return item * 2;});console.log(es5Result); // [ 20, 40, 60, 80 ]// ES6:const es6Result = arrAges.map((item) => item * 2);console.log(es6Result); // [ 20, 40, 60, 80 ]

复制代码

从执行结果来看,在数组上使用map函数返回一个数值翻倍的值作为元素的新数组。从上面的执行结果可以看出,map函数执行的结果还能附加其他方法。

如下代码:

const arrAges = [10, 20, 30, 40];// ES6:const es6Result = arrAges.map((item) => item * 2).reduce((a, b) => a + b);console.log(es6Result); // 200

复制代码

上面的示例,对map函数执行后的结果的数组进行 reduce 函数将所有元素值相加得到一个结果。关于 map 和 reduce 的妙用,可以参见《悟透前端:javascript数组之includes、reduce

区别

从上面的示例,也看出一点不一样。

forEach

  • 遍历完后返回 undefined
  • 它不接受附加其他方法。

map

  • 遍历后返回一个新数组
  • 它接受附加其他函数

结论

如上所见,这些是forEachmap之间的差异。就我而言,我更喜欢使用map方法,因为它返回一个新的不同数组。当然,如果不需要返回的数组,则使用forEach更好。

相关文章
|
21天前
|
JavaScript 前端开发 索引
问js的forEach和map的区别
JavaScript中的`forEach`和`map`都是数组迭代方法。`forEach`遍历数组但不修改原数组,无返回值;它接受回调函数处理元素。`map`则遍历数组并返回新数组,新数组元素为回调函数处理后的结果。两者都接收元素、索引和数组作为回调函数参数。
20 7
|
25天前
|
JavaScript 前端开发
JS require 与 import 的区别
JS require 与 import 的区别
16 1
|
1月前
|
JavaScript
js开发:请解释什么是ES6的类(class),并说明它与传统构造函数的区别。
ES6的类提供了一种更简洁的面向对象编程方式,对比传统的构造函数,具有更好的可读性和可维护性。类使用`class`定义,`constructor`定义构造方法,`extends`实现继承,并可直接定义静态方法。示例展示了如何创建`Person`类、`Student`子类以及它们的方法调用。
22 2
|
1天前
|
JavaScript 前端开发 Oracle
java和JavaScript的区别
java和JavaScript的区别
6 3
|
2天前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
16 3
|
3天前
|
JavaScript 前端开发
js开发:请解释同步和异步编程的区别。
同步编程按顺序执行,易阻塞;异步编程不阻塞,提高效率。同步适合简单操作,异步适合并发场景。示例展示了JavaScript中同步和异步函数的使用。
14 0
|
7天前
|
算法
Swiper库和Glide.js库的性能有何区别
Swiper和Glide.js是两个流行的响应式轮播图库。Swiper功能强大且灵活,支持多方向滑动,拥有丰富的配置和切换效果,适合复杂需求,其高性能得益于优化的算法和惰性加载。Glide.js则轻量级、快速,专注于基础功能,适合简洁需求。两者各有侧重,选择应基于项目具体需求和性能考虑。
|
11天前
|
存储 JavaScript 前端开发
JavaScript DOM 操作:解释一下 cookie、sessionStorage 和 localStorage 的区别。
Cookie是服务器发送至客户端的文本信息,会随每个请求发送回服务器,适合控制会话状态但可能暴露隐私。SessionStorage仅在当前会话中存储数据,关闭浏览器后清除,适合临时存储如登录状态。LocalStorage则持久保存数据,即使关闭浏览器也不会清除,适用于存储长期设置。三种方式各有侧重,应按需求选择。
15 0
|
14天前
|
JavaScript 前端开发
JQuery和JS的区别有哪些?
JQuery和JS的区别有哪些?
13 0
|
14天前
|
JavaScript 前端开发
js中浅拷贝和深拷贝的区别
js中浅拷贝和深拷贝的区别
21 1