网站首页 > 博客文章 正文
在平时做Code Review的时候,经常会看到这样的代码:
someArray.map( x => console.log(x) )
我都会要求修改成forEach,但经常会遇到有人反问:为什么要修改,map也没报错,没问题啊。
今天就想聊一下这个问题。
其实上面的这个代码,还是会有很多人认为应该修改成forEach的,但理由并不一定对。因为提到forEach和map的区别时,很多人会直接不假思索地说:
一个有返回值,一个没有返回值。
这个答案对吗?对,但完全没有触及本质。
真正的答案是:这两个方法其实毫无关系,各自用在各自不同的场景之下,只是看起来能够实现相似的功能而已。
forEach,其实就是for的一个语法糖:
const callback = f
const target = arr
for(let i = 0; i < target.length; i++) {
f(target[i])
}
for代码块中,可以做任何事情,这只是一个按照顺序遍历的过程。
map来自于数学中的概念“函数”,也就是我们初中时候就学过的“一一映射”:把一个集合中的每一个值,按照某种变换过程,映射到另一个集合中。比如把所有的奇数加一,映射成所有的偶数。这个过程在语义上来说并不是“遍历”、“迭代”,而是所有值同时按照箭头方向直接变换,形成一个新的集合。
这个过程中,是不关心过程的,只关心从x到y的这个结果。而这个y很重要。所以,map必须有一个变量来接受新生成的这个y的集合。
同时,因为x到y的映射过程和第三者无关,所以在map的内部,不应该出现任何副作用(给函数外部的其他作用域中的变量赋值、输入、输出,包括网络请求等操作称为副作用)
换句话说:在学过map之前,大家都是用for和forEach来实现的功能,现在就应该还用for/forEach,只有在纯粹的把一个集合映射到另一个集合这一种场景下,大家才应该用map。
现在再回来看开头的那个例子,map有返回值是重点吗?不是。这个过程中出现了副作用,而且并没有把初始集合映射成任何新的集合(映射成了一个满是void的集合)
所以映射本身并不是重点,这就是一个普通的循环,理应直接用for/forEach,而不是选择map。
这样不知道是否解释清楚了呢?
猜你喜欢
- 2024-12-26 Java 8 Stream 处理大数据集:实战与优化
- 2024-12-26 面试官:Java8 lambda 表达式 forEach 如何提前终止?
- 2024-12-26 Excel VBA之For Each遍历循环的应用
- 2024-12-26 为什么建议使用 for…of 循环而不是 foreach 循环呢
- 2024-12-26 前端开发map和foreach区别,map遍历方式用法介绍
- 2024-12-26 Rust语言从入门到精通系列 - 零基础掌握Stream流迭代器
- 2024-12-26 Map遍历的四种方法效率对比
- 2024-12-26 java集合类之java中集合类有哪些?如何分类?
- 2024-12-26 【一分钟学Java】之List
- 2024-12-26 Java并行流:一次搞定多线程编程难题,让你的程序飞起来!
你 发表评论:
欢迎- 最近发表
-
- 给3D Slicer添加Python第三方插件库
- Python自动化——pytest常用插件详解
- Pycharm下安装MicroPython Tools插件(ESP32开发板)
- IntelliJ IDEA 2025.1.3 发布(idea 2020)
- IDEA+Continue插件+DeepSeek:开发者效率飙升的「三体组合」!
- Cursor:提升Python开发效率的必备IDE及插件安装指南
- 日本旅行时想借厕所、买香烟怎么办?便利商店里能解决大问题!
- 11天!日本史上最长黄金周来了!旅游万金句总结!
- 北川景子&DAIGO缘定1.11 召开记者会宣布结婚
- PIKO‘PPAP’ 洗脑歌登上美国告示牌
- 标签列表
-
- ifneq (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)