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 相关文章推荐
javascript中String对象的slice()方法分析
Dec 20 Javascript
jQuery实现的文字hover颜色渐变效果实例
Feb 20 Javascript
JavaScript数组的定义及数字操作技巧
Jun 06 Javascript
canvas 实现中国象棋
Feb 17 Javascript
微信小程序页面开发注意事项整理
May 18 Javascript
webpack 2的react开发配置实例代码
Jul 28 Javascript
使用JS编写的随机抽取号码的小程序
Aug 11 Javascript
js实现关闭网页出现是否离开提示
Dec 07 Javascript
element-ui 中使用upload多文件上传只请求一次接口
Jul 19 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
Oct 25 Javascript
Vue中ref和$refs的介绍以及使用方法示例
Jan 11 Vue.js
微信小程序组件生命周期的踩坑记录
Mar 03 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扩展ZF――Validate扩展
2008/01/10 PHP
PHP项目开发中最常用的自定义函数整理
2010/12/02 PHP
PHP获取http请求的头信息实现步骤
2012/12/16 PHP
php中unlink()、mkdir()、rmdir()等方法的使用介绍
2012/12/21 PHP
zf框架的校验器InArray使用示例
2014/03/13 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
2016/11/05 PHP
详解php中生成标准uuid(guid)的方法
2019/04/28 PHP
js浏览器滚动条卷去的高度scrolltop(实例讲解)
2017/07/07 Javascript
原生JavaScript实现Ajax异步请求
2017/11/19 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
在python的WEB框架Flask中使用多个配置文件的解决方法
2014/04/18 Python
Python中实现的RC4算法
2015/02/14 Python
推荐10款最受Python开发者欢迎的Python IDE
2018/09/16 Python
Python print不能立即打印的解决方式
2020/02/19 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
html5使用Drag事件编辑器拖拽上传图片的示例代码
2017/08/22 HTML / CSS
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
台湾母婴用品限时团购:妈咪爱
2018/08/03 全球购物
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
了解AppleTalk协议吗
2014/04/01 面试题
策划助理岗位职责
2013/11/18 职场文书
主持人演讲稿
2014/05/13 职场文书
社会发展项目建议书
2014/08/25 职场文书
个人事迹材料范文
2014/12/29 职场文书
课外活动总结
2015/02/04 职场文书
春节慰问信范文
2015/02/15 职场文书
2015年检察院个人工作总结
2015/05/20 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
Go语言中break label与goto label的区别
2021/04/28 Golang
详解运行Python的神器Jupyter Notebook
2021/06/03 Python