forEach遍历访问set造成的无限循环问题

抛出问题

先给出一段代码,我们创建了一个集合set,它里面有一个元素数字1和2,接着我们调用forEach方法来遍历该集合。在遍历函数中,首先调用delete方法删除数字1,再执行了某些业务操作后紧接着调用add方法将数字1加回,最后打印 'forEach'。如果我们在浏览器中执行这段代码,就会发现它会无限执行下去。

const set = new Set([1,2])
set.forEach(item => {
  set.delete(1)
	// 这里执行了某些操作
  set.add(1)
  console.log('forEach')
})

在控制台执行一下,效果如下:

在这里插入图片描述

解释一下原因

用官方的原话是这样说的:官方地址

每个值都访问一次,除非在 forEach() 完成之前删除并重新添加它。在访问之前删除的值不会调用 callback。在 forEach() 完成之前添加的新值将被访问。

翻译成白话就是在forEach中遍历Set集合时,如果一个值已经被访问过了,但该值被删除并重新添加到集合,如果此时forEach遍历没有结束,那么该值会重新被访问,这样就会造成无限循环下去。

解决方案

既然我们找到了原因,那么就需要解决这个问题。解决方案也很简单,就是再新建一个newSet集合做一个副本过渡,如下所示:

const set = new Set([1,2])
const newSet = new Set(set)
newSet.forEach(item => {
  set.delete(1)
	// 这里执行了某些操作
  set.add(1)
  console.log('forEach')
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绝对零度HCL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值