最新要闻
- 微贺卡
- 《黑暗荣耀2》热播!演员透露拍摄细节:剧里的蛇是真蛇
- 82版《西游记》编剧戴英禄逝世 六小龄童发文悼念
- 当前关注:理想汽车L8首批车主调研:300名中车主开BBA的最多
- 环球播报:国产车崛起 豪华车丝毫不怂:市场份额继续增 有钱人多
- 最新资讯:努比亚Z50 Ultra首销卖爆:获京东/天猫平台销量销售额冠军
- 卡塔尔世界杯官方授权:富光1.5L顿顿桶29元发车
- 焦点精选!零碳排放!我国首款双源智能重卡成功下线:自带大辫子
- 视焦点讯!全球打广告最划算的一块屏?登上纽约时代广场屏幕只需40美元
- 《狂飙》后 张译宣传新剧《他是谁》:今晚优酷、央视开播
- 获赔近100万 报废奔驰翻新再销售被判退1赔3 网友:C级秒变大S
- 天天最新:dnf游戏闪退怎么解决方法_dnf游戏闪退
- 停车场闸机防骗能力太弱鸡:博主实测一部手机、一张纸均可通行
- 曾模仿东方甄选直播带货 好未来旗下学而思大规模重启线下招生
- 白皮书:购物平台为2022年度消费者投诉最多的行业
- 天天播报:315前海鲜加工厂的狠活被曝光:硼砂泡出黄金鲍 系明令禁止食品添加剂
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
记录--你不知道的forEach函数
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
老实说我不喜欢用forEach,因为它导致的一些bug总是这么不经意,盘点我不喜欢的原因
原因一:不支持处理异步函数
先看一个例子:
【资料图】
async function test() { let arr = [3, 2, 1] arr.forEach(async item => { const res = await mockSync(item) console.log(res) }) console.log("end")}function mockSync(x) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(x) }, 1000 * x) })}test()我们期望的结果是:32 1end但是实际上会输出:end123
JavaScript
中的forEach()
方法是一个同步方法,它不支持处理异步函数。如果你在forEach
中执行了异步函数,forEach()
无法等待异步函数完成,它会继续执行下一项。这意味着如果在forEach()
中使用异步函数,无法保证异步任务的执行顺序。
替代forEach
的方式
1.方式一
可以使用例如map()
、filter()
、reduce()
等,它们支持在函数中返回Promise
,并且会等待所有Promise完成。
使用map()
和Promise.all()
来处理异步函数的示例代码如下:
const arr = [1, 2, 3, 4, 5];async function asyncFunction(num) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(num * 2); }, 1000); });}const promises = arr.map(async (num) => { const result = await asyncFunction(num); return result;});Promise.all(promises).then((results) => { console.log(results); // [2, 4, 6, 8, 10]});
由于我们在异步函数中使用了await
关键字,map()
方法会等待异步函数完成并返回结果,因此我们可以正确地处理异步函数。
方式二 使用for循环来处理异步函数
const arr = [1, 2, 3, 4, 5];async function asyncFunction(num) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(num * 2); }, 1000); });}async function processArray() { const results = []; for (let i = 0; i < arr.length; i++) { const result = await asyncFunction(arr[i]); results.push(result); } console.log(results); // [2, 4, 6, 8, 10]}processArray();
原因二:无法捕获异步函数中的错误
如果异步函数在执行时抛出错误,forEach()
无法捕获该错误。这意味着即使在异步函数中出现错误,forEach()
仍会继续执行。
原因三:除了抛出异常以外,没有办法中止或跳出 forEach()
循环
forEach()
方法不支持使用break
或continue
语句来跳出循环或跳过某一项。如果需要跳出循环或跳过某一项,应该使用for
循环或其他支持break
或continue
语句的方法。
原因四:forEach 删除自身元素,index不可被重置
在forEach
中我们无法控制 index 的值,它只会无脑的自增直至大于数组的 length 跳出循环。所以也无法删除自身进行index重置,先看一个简单例子:
let arr = [1,2,3,4]arr.forEach((item, index) => { console.log(item); // 1 2 3 4 index++;});
原因五:this指向问题
在forEach()
方法中,this
关键字引用的是调用该方法的对象。但是,在使用普通函数或箭头函数作为参数时,this
关键字的作用域可能会出现问题。在箭头函数中,this关键字引用的是定义该函数时所在的对象。在普通函数中,this关键字引用的是调用该函数的对象。如果需要确保this关键字的作用域正确,可以使用bind()方法来绑定函数的作用域。以下是一个关于forEach()
方法中this
关键字作用域问题的例子:
const obj = { name: "Alice", friends: ["Bob", "Charlie", "Dave"], printFriends: function () { this.friends.forEach(function (friend) { console.log(this.name + " is friends with " + friend); }); },};obj.printFriends();在这个例子中,我们定义了一个名为
obj
的对象,它有一个printFriends()
方法。在printFriends()
方法中,我们使用forEach()
方法遍历friends
数组,并使用普通函数打印每个朋友的名字和obj
对象的name
属性。但是,当我们运行这个代码时,会发现输出结果为:undefined is friends with Bobundefined is friends with Charlieundefined is friends with Dave
这是因为,在forEach()
方法中使用普通函数时,该函数的作用域并不是调用printFriends()
方法的对象,而是全局作用域。因此,在该函数中无法访问obj
对象的属性。
为了解决这个问题,可以使用bind()
方法来绑定函数的作用域,或使用箭头函数来定义回调函数。以下是使用bind()
方法解决问题的代码示例:
const obj = { name: "Alice", friends: ["Bob", "Charlie", "Dave"], printFriends: function () { this.friends.forEach( function (friend) { console.log(this.name + " is friends with " + friend); }.bind(this) // 使用bind()方法绑定函数的作用域 ); },};obj.printFriends();
在这个例子中,我们使用bind()
方法来绑定函数的作用域,将该函数的作用域绑定到obj
对象上。运行代码后,输出结果为:
Alice is friends with Bob Alice is friends with Charlie Alice is friends with Dave
通过使用bind()
方法来绑定函数的作用域,我们可以正确地访问obj
对象的属性。
另一种解决方法是使用箭头函数。由于箭头函数没有自己的this
,它会继承它所在作用域的this
。因此,在箭头函数中,this
关键字引用的是定义该函数时所在的对象。代码略
原因六: forEach性能比for循环低
for
:for循环没有额外的函数调用栈和上下文,所以它的实现最为简单。forEach
:对于forEach来说,它的函数签名中包含了参数和上下文,所以性能会低于for
循环。
原因七:会跳过已删除或者未初始化的项
// 跳过未初始化的值const array = [1, 2, /* empty */, 4];let num = 0;array.forEach((ele) => { console.log(ele); num++;});console.log("num:",num);// 1// 2 // 4 // num: 3// 跳过已删除的值const words = ["one", "two", "three", "four"];words.forEach((word) => { console.log(word); if (word === "two") { // 当到达包含值`two`的项时,整个数组的第一个项被移除了 // 这导致所有剩下的项上移一个位置。因为元素`four`正位于在数组更前的位置,所以`three`会被跳过。 words.shift(); //"one" 将从数组中删除 }}); // one // two // fourconsole.log(words); // ["two", "three", "four"]
原因八:forEach使用不会改变原数组
forEach()
被调用时,不会改变原数组,也就是调用它的数组。但是那个对象可能会被传入的回调函数改变
// 例子一const array = [1, 2, 3, 4]; array.forEach(ele => { ele = ele * 3 }) console.log(array); // [1,2,3,4]// 解决方式,改变原数组const numArr = [33,4,55];numArr.forEach((ele, index, arr) => { if (ele === 33) { arr[index] = 999 }})console.log(numArr); // [999, 4, 55]// 例子二const changeItemArr = [{ name: "wxw", age: 22}, { name: "wxw2", age: 33}]changeItemArr.forEach(ele => { if (ele.name === "wxw2") { ele = { name: "change", age: 77 } }})console.log(changeItemArr); // [{name: "wxw", age: 22},{name: "wxw2", age: 33}]// 解决方式const allChangeArr = [{ name: "wxw", age: 22}, { name: "wxw2", age: 33}]allChangeArr.forEach((ele, index, arr) => { if (ele.name === "wxw2") { arr[index] = { name: "change", age: 77 } }})console.log(allChangeArr); // // [{name: "wxw", age: 22},{name: "change", age: 77}]
好了,我还是使用for...of
去替代forEach
吧
本文转载于:
https://juejin.cn/post/7207411012487381051
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
关键词:
记录--你不知道的forEach函数
智能勘探 | AIRIOT智慧油田管理解决方案
环球聚焦:NOI春季测试游记
微贺卡
《黑暗荣耀2》热播!演员透露拍摄细节:剧里的蛇是真蛇
82版《西游记》编剧戴英禄逝世 六小龄童发文悼念
当前关注:理想汽车L8首批车主调研:300名中车主开BBA的最多
环球播报:国产车崛起 豪华车丝毫不怂:市场份额继续增 有钱人多
最新资讯:努比亚Z50 Ultra首销卖爆:获京东/天猫平台销量销售额冠军
报道:第一章 软件工程概述
每日看点!centos7.9离线升级openssl和openssh9.2
python语言基础
每日焦点!Mysql数据库未添加索引引发的生产事故
对极几何的理解和原理推导
卡塔尔世界杯官方授权:富光1.5L顿顿桶29元发车
焦点精选!零碳排放!我国首款双源智能重卡成功下线:自带大辫子
视焦点讯!全球打广告最划算的一块屏?登上纽约时代广场屏幕只需40美元
《狂飙》后 张译宣传新剧《他是谁》:今晚优酷、央视开播
获赔近100万 报废奔驰翻新再销售被判退1赔3 网友:C级秒变大S
每日快讯!10Wqps 超高并发 API网关 架构演进之路
Egg.js 学习笔记01
世界快看:git提交规范
【全球速看料】早起、冥想、阅读、写作、运动
焦点讯息:观察者模式——学习笔记
天天最新:dnf游戏闪退怎么解决方法_dnf游戏闪退
停车场闸机防骗能力太弱鸡:博主实测一部手机、一张纸均可通行
曾模仿东方甄选直播带货 好未来旗下学而思大规模重启线下招生
白皮书:购物平台为2022年度消费者投诉最多的行业
天天播报:315前海鲜加工厂的狠活被曝光:硼砂泡出黄金鲍 系明令禁止食品添加剂
世界焦点!两只售价3899元:华硕ROG推出魔方幻路由器月曜白限定版
卷起来!!!看了这篇文章我才知道MySQL事务&MVCC到底是啥?
蓝牙Mesh简介(一)设备标识:UUID和Mesh地址
开源免费:分享powershell读写k8s的etcd的脚本库
环球速递!冲击全球的“硅谷银行破产”到底咋回事?会不会引爆危机?
视点!国产AYA新掌机Ayaneo 2 IGN9分好评:价格贵 但很好用!
【聚看点】央视3·15晚会官宣明晚举办 这次谁会被曝光?
世界最资讯丨配置大升级!新款比亚迪唐DM-i/汉EV冰川蓝实车亮相:绝对吸睛
上海测试9辆自动驾驶清扫车 可替代25名环卫工人
干货来袭!3天0基础Python实战项目快速学会人工智能必学数学基础全套(含源码)(第3天)概率分析篇:条件概率、全概率与贝叶斯公式
韩国电视台剪掉杨紫琼获奖感言:鼓励女性部分没了
腾讯会议重大调整!取消免费300人不限时会议使用
世界看热讯:斥资10亿美元!NASA将开发太空拖船:实现国际空间站受控坠落
那些曾被315点过名的品牌怎么样了?英菲尼迪道歉并更换变速箱 汉堡王被罚
实时焦点:车圈大V杨学良晒魅族20 Pro真机:极简设计 好看又好用!
与微软聊天机器人对话
Vue项目迁移小程序,实操干货分享
戴尔PC要100%离开中国!完整时间表曝光:真着急
天天微资讯!韩媒称特斯拉停止与比亚迪合作 马斯克:虚假报道、双方关系积极
魔兽世界将推出全新硬核玩法:一命通关、挂了就得重来
ai文件怎么打开?ai文件用什么软件打开和编辑?
斐讯k1支持千兆吗?斐讯k1路由器怎么设置?
windows如何一键还原?windows截图保存在哪里?
声卡怎么调试?声卡什么牌子的音质比较好?
笔记本fn键在哪里?fn键怎么开启和关闭?
每日短讯:可插拔组件设计机制—SPI
今日热讯:Vim 备忘清单_开发速查表分享
世界头条:Linux进程的创建与销毁
鲨鱼求偶被误认吃“同事” 官方回应:是繁殖行为 撕咬有分寸
天天热文:减肥不吃主食?医生提醒:可致大脑功能衰退
全球热消息:《小丑2》Lady Gaga小丑女新片场照 造型太好看了
全球报道:极速直追中国高铁!碳陶瓷刹车套件特斯拉Model S Plaid打破单圈纪录
【全球报资讯】一键开盖:哈尔斯600ml水杯9.9元狂促 Tritan材质款23.9元
天天热头条丨阳高县气象台发布大风蓝色预警【Ⅳ级/一般】
全球微头条丨java操作excel文件——POI
天天讯息:剑指 Offer 68 - II. 二叉树的最近公共祖先(java解题)
分布式架构-可观测性
obs studio 插件
看热讯:小米子公司发通告:拼多多、京东、淘宝上的“紫米官旗”不是我
硅谷银行停业没影响!贾跃亭要“翻身”:4月26日FF91终极发布
世界今日讯!德国反对2035禁售燃油车!欧盟做出让步:内燃机还有活路
天天观热点:Intel要求电源厂商使用单一规格制作12VHPWR接头
马斯克减肥神药遭疯抢!欧洲药管局警告:2023年都会短缺
天天热讯:DockQuery | 基于E-R图的数据建模功能使用实践
宝马iX3高速撞车 车主:车道纠偏系统和自己抢方向盘酿事故
环球最新:公司回应因给客户倒水太满开除员工:该走啥程序走啥程序
新机型“无可奉告”:任天堂称对Switch未来充满信心
【全球速看料】史上最大规模!魅族领克无界生态发布会官宣:魅族20系列、Flyme 10来了
全球视点!一加逆袭!成为2023年销量增速最快的品牌:友商普遍下滑
共314套房源!昌平区公租房配租公告来了
焦点资讯:GO语言学习笔记-测试篇 Study for Go ! Chapter ten- Test
要闻速递:面试官:怎么删除 HashMap 中的重复元素?第 3 种实现思路,99% 的人不会!
世界快消息!k8s的Helm 工具安装
RPC框架JMH测试-chatgpt自动生成
前端设计模式——代理模式
全球视讯!特斯拉叫停与比亚迪合作?比亚迪回应:不实信息
环球即时:苹果人事巨震:11位高管扎堆离职 库克也要降薪40%
微头条丨燃油车 真凉透了吗
【天天时快讯】采用全新NT架构:新Windows端QQ首个版本将于24日发布
世界资讯:剧版打破多项纪录!爱奇艺考虑拍《狂飙》电影版 网友评论两级分化
每日看点!插件化开发详解
关注:读Java性能权威指南(第2版)笔记16_垃圾回收C
全球滚动:京东小程序CI工具实践
巧妙使用SQL Server的计算列实现项目唯一规则快速定制
天天快资讯:免费玩没戏 《暗黑4》不会加入微软XGP:四五百块还是要花的
首位华裔奥斯卡影后!杨紫琼84岁母亲喜极而泣 为女儿感到自豪
世界微资讯!Redis内存碎片深入分析
多举措提高职教吸引力 助力职业教育“强起来”“活起来”
焦点简讯:曝苹果最快2024年商用MicroLED屏:比OLED更香
今日快讯:7月1日普及!我国将全面淘汰传统后视镜 都换汽车电子后视镜:上游供应链已准备好
全球今日报丨老人捡钱不愿归还 女孩崩溃下跪引网友愤怒:律师称可起诉 专家喊话不能仗着年龄大