map for循环_JavaScript 用 for 循环太 low?你是不是有什么误解

天要吐槽下,我时不时地看到有些文章说“循环语句不好,你应该用 filter,map 和 reduce ”——每次看到有文章鼓吹,所有需要循环的场景一律用这几个函数式方法,我都恨得牙痒痒。

没错,这些函数式方法确实有它们的用途。我不是说你不能用它们,而是说不能不管三七二十一,到处滥用。在许多情况下,如果你想写性能好的代码,for 循环基本上是更好的选择。

map, filter 和reduce等方法的目的是防止传入的内容发生改变。在FP(函数式编程)风格中,向这些方法传递一个数组将返回一个新集合,而原始集合则保持不变。

对于map来说(因为它似乎是最容易被滥用和性能最差的),与for循环相比,差异可能是显著的。原因是map将创建一个新的副本,在每次迭代时触发一个回调并消耗更多的内存。 for循环只是在执行迭代的内容,所以它几乎没有开销。

有人专门创建了一个仓库,将它们做了对比,对于大量数据的对比结果是惊人的(如果你知道这些方法的工作原理,你就一点也不觉得奇怪了)。

在我的 web应用中,我现在比以前更倾向于使用map, filter 和reduce。但我也注意到,在某些情况下,for循环是更好的选择,因为for循环可以做这些方法不能做的事情。

中止循环

你可能已经知道了,可以使用break关键字来中止for循环。如果使用for循环遍历数组,直到找到特定的值或运行了一定次数的迭代,就可以通过在循环中执行break来中止循环。

相反,map, filter 和reduce本身不能被终止;它们将一直迭代直到遍历完数组中的每一项。

异步循环

for循环可以很容易地与async/await一起使用,这意味着你可以暂停循环,让它等待一个promise被解决,然后再继续迭代下一个值。

当你尝试将async/await混合使用时,函数式方法map, filter 和reduce 将会产生混乱。如果 await累加器,你可以勉强让reduce 正常工作,但总感觉不太对劲。

for 循环就容易多了,所以为什么自找麻烦呢?而且,async/await 可以在各种形式的for循环里使用。

你还在干这种事吗?快住手

async function loadValues() {let myValues = await getValuesFromApi();myValues = myValues.map(value => {value.total = value.price * value.quantity;return value;});
}

有人用map遍历对象数组,只是为了修改数组里的对象属性值,然后又把整个结果赋值给原始数组,这种做法我见得太多了。map的本意其实是创建数组的一个副本,但是很多人把它当作循环来用,而且还把结果重新赋值给原来的变量,好歹用个新变量啊。

如果你也是这么做的,趁早纠正过来。用for循环就行了,因为那才是你本该做的。这种情况用map 你得不到任何好处。

总结

在大部分情况下,你用前面提到的任何一个函数式方法,在性能上跟传统的for循环相比几乎没有差别。如果不是处理几万、几十万条数据,性能差别不超过100ms。

先用你认为合适的方式去写代码,然后如果发现性能不够理想,你可以使用浏览器开发人员工具和常识来确定应用程序的哪些方面可以优化。

记住:过早的优化是万恶之源。

c451f52b0c64c4e5d81a1d0b1036fd00.png
作者:1024译站
链接:https://www.jianshu.com/p/494ad0a7abba
来源:简书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单工程验收单表格_中铁超大型工程项目-123个精细化管理手册配套表格附件,超全...

中铁超大型工程项目-123个精细化管理手册配套表格附件,超全!什么是项目精细化?答:工程项目精细化管理是一个系统的管理体系,包含一系列管理制度和办法,除了《工程项目精细化管理办法》这个纲领性文件外&…

判断unsigned long long乘法溢出_信息安全课程17:缓冲区溢出2

在之前所讲述的内容中,都是我们在自己的程序中自行修改的;正常情况下,没有程序员会在自己的代码中这样写——那有没有办法攻击别人正常的程序呢?攻击者怎么样能够影响到不是自己的程序的返回地址呢?以及怎么样通过攻击…

java 保垒机telnet,开源堡垒机系统Teleport

一. teleport简介Teleport是一款简单易用的堡垒机系统,具有小巧、易用的特点,支持 RDP/SSH/SFTP/Telnet 协议的远程连接和审计管理。Teleport由两大部分构成:跳板核心服务WEB操作界面官网地址: https://tp4a.com/ 官网文档: https://docs.…

php背景图片随页面大小改变,css背景图根据屏幕大小自动缩放

css背景图根据屏幕大小自动缩放代码:html,body{margin:0px;padding:0px;}#background { position: fixed;top: 0;left: 0;width: 100%;height: 100%;overflow: hidden;background-color: #211f1f; display:none\8;}#background .bg-photo {position: absolute;top: …

forever不重启 node_运维监控Prometheus,部署安全的node_exporter监控主机

简介prometheus监控系统的时候,是使用pull的方式来获取监控数据,需要被监控端监听对应的端口,prometheus从这些端口服务中拉取对应的数据。node_exporter安全性讨论node_exporter是收集操作系统的指标的一个程序。例如CPU,内存&am…

netbeans ide_IDE:5个最喜欢的NetBeans功能

netbeans ide愉快的发展……。 NetBeans具有许多有趣的功能 ,这些功能使开发非常容易,只需很少的步骤,并且可以在非常快速地将产品推向市场的过程中创造出非常高效的环境 。 将我的谈话仅限于五个功能非常困难,而此IDE具有大量有…

那是两个小时我不会回来

正如我之前关于linting主题所说的 ,花时间修改代码的好处很有限,因为自动工具告诉您这样做。 更糟糕的是,这些工具并非万无一失。 例如,我们一直在针对完美无害的try-with-resources构造周围的SpotBugs警告中添加排除项&#xff…

oracle 查询不同编号的时间最小记录_投稿 | ORACLE amp; PostgreSql 利用伪列删除完全重复的两行...

作者:缪晓丽DBA、数据库爱好者、从业10年。对 DB2、PostgreSQL、Oracle 均有较长的运维经验。本次演示的 test 表如下:01Oracle 的 rowidSQL 语句:DELETE FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY id) AS rn, id, name…

addcslashes php,php addcslashes函数怎么用

php addcslashes函数返回在指定字符前添加反斜杠的字符串。其语法是addcslashes(string,characters),参数string是必须的,规定要转义的字符串,characters是必须,规定要转义的字符或字符范围。addcslashes函数怎么用?作…

struct类型重定义 不同的基类型_C++构造数据类型

结构体(struct)定义:结构体是一个数据类型,是由多个不同类型的数据组成的数据集合。关键字为:struct 。优点:大大减少程序代码的离散性,使程序代码阅读更加符合逻辑。语法:struct 结构体类型名{ 成员类型 成…

php zip怎么安装,php如何安装zip模块?(方法介绍)

php 安装zip模块为php安装zip扩展wget http://pecl.php.net/get/zip-1.13.5.tgz tar -zvxf zip-1.13.5.tgz cd zip-1.13.5 /home/xxx/php/bin/phpize出现错误:Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment va…

vs如何写多线程_java中的多线程的示例

在讨论多线程之前,让我们先讨论线程。线程是进程中轻量级的最小部分,可以与同一进程的其他部分(其他线程)并发运行。线程是独立的,因为它们都有独立的执行路径,这就是为什么如果一个线程中发生异常,它不会影响其他线程…

matlab mex路径,使用matlab进行mex编译时的路径问题mexopts

matlab和vs 进行混合编程时总需要使用matlab编译mexFunction.cpp文件。这些文件免不了使用include下的*.h和lib下的*.lib文件。举matlab和vs 进行混合编程时总需要使用matlab编译mexFunction.cpp文件。这些文件免不了使用include下的*.h和lib下的*.lib文件。举例说明&#xff0…

hystrix应用 博客_用Hystrix保护您的应用程序

hystrix应用 博客在先前的帖子http://www.javacodegeeks.com/2014/07/rxjava-java8-java-ee-7-arquillian-bliss.html中,我们讨论了微服务以及如何使用(RxJava)的Reactive Extensions编排微服务。 但是,如果一项或多项服务因已停止…

艾默生变频器报警PHP,艾默生ct变频器报警ou 这个CT的变频器报警UU怎么解决?

1, 这个CT的变频器报警UU怎么解决?(1) 控制板Q1(15050026)坏。(2) 7840坏:在变频器通电时,用直流档,黑接5脚,红分别接6,7,8脚,值为2.5,2.5,5为正常,否则7840坏。(3) 小板坏:在变频器…

Project Reactor展开方法

最近,我的一位同事向我介绍了Project Reactor类型的expand运算符,在这篇文章中,我想介绍几种使用它的方式。 展开分页结果 考虑在名为City的模型上基于Spring Data的存储库: import org.springframework.data.jpa.repository.Jpa…

同时买票是怎么实现的_去巴黎玩怎么买地铁票最划算?| 巴黎最全交通攻略

次票、天票、机场票……傻傻分不清楚。不会法语怎么办?什么时候买有优惠?看这一篇全知道​​巴黎作为国际大都市,交通还是非常方便的。基本上80%的巴黎景点都能坐地铁到达,就在我们平常所说的小巴黎里。整个巴黎岛(Ile…

php输入地址查询,PHP查询用户IP所在地址

原创内容,转载请注明出处:https://www.myzhenai.com.cn/post/3042.html关键词:IP所在地址 IP地址 PHP获取ip地址相关内容:获取IP所处位置的Shell代码:https://www.myzhenai.com.cn/post/2917.htmlWordPress获取当前浏览…

swig模板 PHP,如何使用nodejs前端模板引擎swig

这次给大家带来如何使用nodejs前端模板引擎swig,使用nodejs前端模板引擎swig的注意事项有哪些,下面就是实战案例,一起来看一下。相对于jade,我还是更喜欢swig前端模板引擎,jade虽然语法简练高效了不少,但是…

redis是什么_什么是Redis?为什么我们要用Redis?

前言当结束Java和数据库的学习以后,你就会接触到Redis这个词,我第一次听到的时候脑海里就会浮现这两个问题:什么是Redis?为什么我们要用Redis?我了解完以后,写出来帮助大家能够更快的认识它。我们先来看它的…