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 相关文章推荐
TFDN图片播放器 不错自动播放
Oct 03 Javascript
js 目录列举函数
Nov 06 Javascript
JavaScript null和undefined区别分析
Oct 14 Javascript
网页上的Javascript编辑器和代码格式化
Apr 25 Javascript
jquery实用代码片段集合
Aug 12 Javascript
一个JQuery写的点击上下滚动的小例子
Aug 27 Javascript
关于Javascript与iframe的那些事儿
Jul 04 Javascript
JavaScript的设计模式经典之代理模式
Feb 24 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
May 06 Javascript
javascript网页随机点名实现过程解析
Oct 15 Javascript
vue移动端下拉刷新和上滑加载
Oct 27 Javascript
javascript this指向相关问题及改变方法
Nov 19 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重定向的3种方式
2013/03/07 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
Alliance vs Liquid BO3 第二场2.13
2021/03/10 DOTA
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
用javascript为页面添加天气显示实现思路及代码
2013/12/02 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
浅谈JavaScript中的对象及Promise对象的实现
2015/11/15 Javascript
Flow之一个新的Javascript静态类型检查器
2015/12/21 Javascript
js正则表达式验证表单【完整版】
2017/03/06 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
python改变日志(logging)存放位置的示例
2014/03/27 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
详解Python中的正则表达式
2018/07/08 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
html5画布旋转效果示例
2014/01/27 HTML / CSS
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
DELPHI中如何调用API,可举例说明
2014/01/16 面试题
大学生毕业求职简历的自我评价
2013/10/24 职场文书
电子商务专业推荐信范文
2013/12/02 职场文书
cf搞笑广告词
2014/03/14 职场文书
对孩子的寄语
2014/04/09 职场文书
考核评语大全
2014/04/29 职场文书
开展批评与自我批评发言材料
2014/05/15 职场文书
雨中的树观后感
2015/06/03 职场文书
利用Python实现Picgo图床工具
2021/11/23 Python
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA