JS中Map和ForEach的区别

 更新时间:2018年02月05日 10:00:47   投稿:laozhang  
本篇文章给大家详细分析了JS中Map和ForEach的区别以及用法上的不同之处,对此有兴趣的朋友参考学习下吧。

如果你已经有使用JavaScript的经验,你可能已经知道这两个看似相同的方法:Array.prototype.map()和Array.prototype.forEach()。

那么,它们到底有什么区别呢?

定义

我们首先来看一看MDN上对Map和ForEach的定义:

forEach(): 针对每一个元素执行提供的函数(executes a provided function once for each array element)。

map(): 创建一个新的数组,其中每一个元素由调用数组中的每一个元素执行提供的函数得来(creates a new array with the results of calling a provided function on every element in the calling array)。

到底有什么区别呢?forEach()方法不会返回执行结果,而是undefined。也就是说,forEach()会修改原来的数组。而map()方法会得到一个新的数组并返回。

示例

下方提供了一个数组,如果我们想将其中的每一个元素翻倍,我们可以使用map和forEach来达到目的。

let arr = [1, 2, 3, 4, 5];

ForEach

注意,forEach是不会返回有意义的值的。

我们在回调函数中直接修改arr的值。

arr.forEach((num, index) => {
 return arr[index] = num * 2;
});

执行结果如下:

// arr = [2, 4, 6, 8, 10]

Map

let doubled = arr.map(num => {
 return num * 2;
});

执行结果如下:

// doubled = [2, 4, 6, 8, 10]

执行速度对比

jsPref是一个非常好的网站用来比较不同的JavaScript函数的执行速度。

这里是forEach()和map()的测试结果:

可以看到,在我到电脑上forEach()的执行速度比map()慢了70%。每个人的浏览器的执行结果会不一样。你可以使用下面的链接来测试一下: Map vs. forEach - jsPref。

JavaScript太灵(gui)活(yi)了,出了BUG你也不知道,不妨接入Fundebug线上实时监控。

函数式角度的理解

如果你习惯使用函数是编程,那么肯定喜欢使用map()。因为forEach()会改变原始的数组的值,而map()会返回一个全新的数组,原本的数组不受到影响。

哪个更好呢?

取决于你想要做什么。

forEach适合于你并不打算改变数据的时候,而只是想用数据做一些事情 – 比如存入数据库或则打印出来。

let arr = ['a', 'b', 'c', 'd'];
arr.forEach((letter) => {
 console.log(letter);
});
// a
// b
// c
// d

map()适用于你要改变数据值的时候。不仅仅在于它更快,而且返回一个新的数组。这样的优点在于你可以使用复合(composition)(map(), filter(), reduce()等组合使用)来玩出更多的花样。

let arr = [1, 2, 3, 4, 5];
let arr2 = arr.map(num => num * 2).filter(num => num > 5);
// arr2 = [6, 8, 10]

我们首先使用map将每一个元素乘以2,然后紧接着筛选出那些大于5的元素。最终结果赋值给arr2。

核心要点

能用forEach()做到的,map()同样可以。反过来也是如此。

map()会分配内存空间存储新数组并返回,forEach()不会返回数据。

forEach()允许callback更改原始数组的元素。map()返回新的数组。

相关文章

  • JavaScript基础介绍与实例

    JavaScript基础介绍与实例

    这篇文章介绍了JavaScript的基础与实例,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • JavaScript数据结构和算法之图和图算法

    JavaScript数据结构和算法之图和图算法

    这篇文章主要介绍了JavaScript数据结构和算法之图和图算法,本文讲解了有向图、无序图、简单图、图的遍历等内容,需要的朋友可以参考下
    2015-02-02
  • 使用 Next.js Cli 快速搭建和运行 Web 应用

    使用 Next.js Cli 快速搭建和运行 Web 应用

    这篇文章主要介绍了使用 Next.js Cli 快速搭建和运行 Web 应用,需要的朋友可以参考下
    2024-04-04
  • Json和Jsonp理论实例代码详解

    Json和Jsonp理论实例代码详解

    JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议,本文从理论到实践详细的讲解了JSON和JSONP的使用
    2013-11-11
  • JavaScript DOM 学习第九章 选取范围的介绍

    JavaScript DOM 学习第九章 选取范围的介绍

    这一章会对范围对象做一些介绍。使用这个对象你能选取HTML文档中的任何部分然后根据选取信息作一些事情。最常见的范围对象是由用户选择的。
    2010-02-02
  • 中文路径导致unitpngfix.js不正常的解决方法

    中文路径导致unitpngfix.js不正常的解决方法

    本篇文章是对中文路径导致unitpngfix.js不正常的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Javascript基础教程之数据类型转换

    Javascript基础教程之数据类型转换

    JavaScript是一种无类型语言,但同时JavaScript提供了一种灵活的自动类型转换的处理方式。基本规则是,如果某个类型的值用于需要其他类型的值的环境中,JavaScript就自动将这个值转换成所需要的类型。
    2015-01-01
  • JavaScript 关于事件循环机制的刨析

    JavaScript 关于事件循环机制的刨析

    js里的事件循环机制十分有趣。从很多面试题也可以看出来,考察简单的setTimeout也就是考察这个机制的,接下来本文带你详细了解它
    2021-11-11
  • 学习js在线html(富文本,所见即所得)编辑器

    学习js在线html(富文本,所见即所得)编辑器

    需要一个可以编辑同时又可显效果的编辑框。textarea不行,它只能用来输入纯文本,不能显示颜色、斜体之类的文字样式,就像记事本,本文介绍所见即所得编辑器实现原理
    2012-12-12
  • Javascript学习笔记3 作用域

    Javascript学习笔记3 作用域

    每个写过程序的人都不会对作用域这个概念陌生,那在这篇文章中就来谈下Javascript的作用域。
    2010-01-01

最新评论