深拷贝的循环引用

要解决这个问题之前,首先要知道什么是深拷贝。

所谓深拷贝就是指拷贝一个引用数据类型的数据并且改变引用地址,使拷贝得来的数据与源数据不搭噶,不互相影响。

刚开始学习的时候知道就是写一个函数去遍历要拷贝的数据,通过判断当前节点是否为引用数据类型来决定继续遍历(调用自己)还是结束函数。没有思考过如果最后一个节点仍为引用数据类型,那么就会出现死循环的情况(爆栈)。于是进行一番思考加结合网络答案,以下为思考总结。去百度找答案的前提是自己弄清了问题,知道了必须解决这个问题,我的想法是遍历的时候塞一个不一样的值,因为es6我不知道weakMap这个方法,有人说这个weakMap算是比较无用的,但在此处我觉得恰逢其时。

从头开始:

如果你要拷贝一个对象的时候,如果值是他自己呢?遍历的遇到值是自己 又是一个对象 继续遍历 然后发现这个值又是自己 又继续遍历,从而造成一个死循环=>爆栈。

作法为:使用weakMap先将要遍历的obj存一份,在每次递归的时候判断,如果值为自己,就直接return 取出结果。(满分面试题!)以下附上代码

weakMap 的 key 必须是对象,通过将源obj当key,cloneObj为value储存起来,判断是否应该return

 我只是先存起来,等我再思考一下再优化,勿喷,刚学前端3个月

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值