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 相关文章推荐
jquery清空表单数据示例分享
Feb 13 Javascript
jQuery中mouseover事件用法实例
Dec 26 Javascript
js中利用tagname和id获取元素的方法
Jan 03 Javascript
JavaScript中boolean类型之三种情景实例代码
Nov 21 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
May 10 Javascript
详解性能更优越的小程序图片懒加载方式
Jul 18 Javascript
基于Angularjs-router动态改变Title值的问题
Aug 30 Javascript
浅谈HTTP 缓存的那些事儿
Oct 17 Javascript
React事件处理的机制及原理
Dec 03 Javascript
解决layui富文本编辑器图片上传无法回显的问题
Sep 18 Javascript
Vue实现兄弟组件间的联动效果
Jan 21 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
Jul 30 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制作的意见反馈表源码
2007/03/11 PHP
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
php中利用post传递字符串重定向的实现代码
2011/04/21 PHP
CI框架扩展系统核心类的方法分析
2016/05/23 PHP
php cookie用户登录的详解及实例代码
2017/01/03 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
javascript XML数据显示为HTML一例
2008/12/23 Javascript
jQuery textarea的长度进行验证
2009/05/06 Javascript
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
2010/03/23 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
2017/05/22 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
解决Echarts2竖直datazoom滑动后显示数据不全的问题
2020/07/20 Javascript
关于Python如何避免循环导入问题详解
2017/09/14 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
解决pycharm回车之后不能换行或不能缩进的问题
2019/01/16 Python
python opencv判断图像是否为空的实例
2019/01/26 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
python实现图片转字符画
2021/02/19 Python
Canvas图片分割效果的实现
2019/07/29 HTML / CSS
如何为DataGridView添加一个定制的Column Type
2014/01/21 面试题
外贸实习生自荐信范文
2013/11/24 职场文书
室内趣味活动方案
2014/08/24 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
义诊活动总结
2015/02/04 职场文书
大学生读书笔记大全
2015/07/01 职场文书
mysql脏页是什么
2021/07/26 MySQL
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技