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 相关文章推荐
将string解析为json的几种方式小结
Nov 11 Javascript
Egret引擎开发指南之运行项目
Sep 03 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
May 26 jQuery
JS自定义滚动条效果简单实现代码
Oct 27 Javascript
浅谈Vue-cli 命令行工具分析
Nov 22 Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
Dec 07 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
Sep 01 Javascript
vue 本地环境跨域请求proxyTable的方法
Sep 19 Javascript
浅谈KOA2 Restful方式路由初探
Mar 14 Javascript
微信小程序文章详情页跳转案例详解
Jul 09 Javascript
关于vue属性使用和不使用冒号的区别说明
Oct 22 Javascript
JavaScript实现网页下拉菜单效果
Nov 20 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+DBM的同学录程序(4)
2006/10/09 PHP
php去掉文件前几行的方法
2015/07/29 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
符合标准的js表单提交的代码
2007/09/13 Javascript
键盘KeyCode值列表汇总
2013/11/26 Javascript
js实现的GridView即表头固定表体有滚动条且可滚动
2014/02/19 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
浅析javascript操作 cookie对象
2014/12/26 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
js浏览器html5表单验证
2016/10/17 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
EasyUI为Numberbox添加blur事件的方法
2017/03/05 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
JS实现按钮添加背景音乐示例代码
2017/10/17 Javascript
关于layui 弹出层一闪而过就消失的解决方法
2019/09/09 Javascript
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[49:59]KG vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python函数嵌套实例
2014/09/23 Python
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
对python中的six.moves模块的下载函数urlretrieve详解
2018/12/19 Python
Python3.5运算符操作实例详解
2019/04/25 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
计算机应用专业毕业生求职信
2013/10/24 职场文书
经济与贸易专业应届生求职信
2013/11/19 职场文书
技术副厂长岗位职责
2013/12/26 职场文书
超市后勤自我鉴定
2014/01/17 职场文书
销售岗位职责范本
2014/06/12 职场文书
司法助理专业自荐书
2014/06/13 职场文书
中文专业自荐书
2014/06/29 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
家长对学校的意见和建议
2015/06/03 职场文书
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python