浅谈 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更好。

相关文章
|
7月前
|
存储 缓存 JavaScript
Set和Map有什么区别?
Set和Map有什么区别?
556 1
|
8月前
|
存储 编译器 容器
set、map、multiset、multimap的介绍及使用以及区别,注意事项
set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列。set当中存储元素的value都是唯一的,不可以重复,因此可以使用set进行去重。set默认是升序的,但是其内部默认不是按照大于比较,而是按照小于比较。set中的元素不能被修改,因为set在底层是用二叉搜索树来实现的,若是对二叉搜索树当中某个结点的值进行了修改,那么这棵树将不再是二叉搜索树。
308 0
|
11月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
JavaScript 前端开发 容器
this、self、window、top 在 JavaScript 中的区别深入研究
在 JavaScript 开发中,`this`、`self`、`window` 和 `top` 是四个常用的概念。`this` 指向当前执行上下文的对象,其值取决于函数调用方式;`self` 在全局作用域中等同于 `window`,常用于 Web Workers;`window` 代表浏览器窗口,是全局变量的容器;`top` 指向最顶层窗口,用于判断是否在框架中。理解这些概念有助于编写健壮的代码。
426 1
this、self、window、top 在 JavaScript 中的区别深入研究
|
10月前
|
JavaScript 前端开发 开发者
flat、flatmap与map的用法区别
本文介绍了 JavaScript 数组方法 `flat()`、`flatMap()` 和 `map()` 的用法及区别。`flat()` 可按指定深度递归展平数组,参数为深度,默认一层;`flatMap()` 结合了 `map()` 和 `flat()` 功能,返回一维数组,长度可能不同于原数组;而 `map()` 返回与原数组长度一致的新数组。通过多个代码示例展示了三者的功能和差异,帮助开发者更好地理解和使用这些方法。
1130 0
|
11月前
|
移动开发 运维 供应链
通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
11月前
|
供应链 JavaScript 前端开发
通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
存储
`map()`方法在什么场景下会比 `forEach()`方法更高效?
综上所述,当需要对数组元素进行复杂的转换并生成新数组、进行链式调用和函数式编程、处理元素之间存在明确映射关系的情况以及与其他数组方法结合使用时,`map()`方法比`forEach()`方法更高效,能够使代码更加简洁、清晰和易于维护。
228 32
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
322 1