JS中Map和ForEach的区别


Posted in Javascript onFebruary 05, 2018

如果你已经有使用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()的测试结果:

JS中Map和ForEach的区别

可以看到,在我到电脑上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 相关文章推荐
纯js实现瀑布流展现照片(自动适应窗口大小)
Apr 08 Javascript
浏览器页面区域大小的js获取方法
Sep 21 Javascript
javaScript对文字按照拼音排序实现代码
Dec 27 Javascript
javascript设计模式之解释器模式详解
Jun 05 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
Oct 30 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
Nov 26 Javascript
Ionic3 UI组件之Gallery Modal详解
Jun 07 Javascript
Vue2.0子同级组件之间数据交互方法
Feb 28 Javascript
安装Node.js并启动本地服务的操作教程
May 12 Javascript
浅谈webpack SplitChunksPlugin实用指南
Sep 17 Javascript
微信小程序实现点击效果
Jun 21 Javascript
vue3修改link标签默认icon无效问题详解
Oct 09 Javascript
完美解决axios跨域请求出错的问题
Feb 05 #Javascript
vue 页面加载进度条组件实例
Feb 05 #Javascript
JS设计模式之状态模式概念与用法分析
Feb 05 #Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
Feb 05 #Javascript
vue实现图片加载完成前的loading组件方法
Feb 05 #Javascript
JS设计模式之策略模式概念与用法分析
Feb 05 #Javascript
Node.js成为Web应用开发最佳选择的原因
Feb 05 #Javascript
You might like
分享PHP守护进程类
2015/12/30 PHP
php中this关键字用法分析
2016/12/07 PHP
html下载本地
2006/06/19 Javascript
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
理解Javascript_03_javascript全局观
2010/10/11 Javascript
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
多浏览器兼容性比较好的复制到剪贴板的js代码
2011/10/09 Javascript
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
vue从使用到源码实现教程详解
2016/09/19 Javascript
AngularJS实现星星等级评分功能
2016/09/24 Javascript
JS区分Object与Aarry的六种方法总结
2017/02/27 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
javascript+HTML5 canvas绘制时钟功能示例
2019/05/15 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
如何表示python中的相对路径
2020/07/08 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
Europcar澳大利亚官网:全球汽车租赁领域的领导者
2019/03/24 全球购物
八年级美术教学反思
2014/02/02 职场文书
2014全国两会大学生学习心得体会
2014/03/10 职场文书
学校四风对照检查材料
2014/08/28 职场文书
办公室领导干部作风整顿个人整改措施
2014/09/17 职场文书
委托公证书样本
2015/01/23 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书