要解决这个问题之前,首先要知道什么是深拷贝。
所谓深拷贝就是指拷贝一个引用数据类型的数据并且改变引用地址,使拷贝得来的数据与源数据不搭噶,不互相影响。
刚开始学习的时候知道就是写一个函数去遍历要拷贝的数据,通过判断当前节点是否为引用数据类型来决定继续遍历(调用自己)还是结束函数。没有思考过如果最后一个节点仍为引用数据类型,那么就会出现死循环的情况(爆栈)。于是进行一番思考加结合网络答案,以下为思考总结。去百度找答案的前提是自己弄清了问题,知道了必须解决这个问题,我的想法是遍历的时候塞一个不一样的值,因为es6我不知道weakMap这个方法,有人说这个weakMap算是比较无用的,但在此处我觉得恰逢其时。
从头开始:
如果你要拷贝一个对象的时候,如果值是他自己呢?遍历的遇到值是自己 又是一个对象 继续遍历 然后发现这个值又是自己 又继续遍历,从而造成一个死循环=>爆栈。
作法为:使用weakMap先将要遍历的obj存一份,在每次递归的时候判断,如果值为自己,就直接return 取出结果。(满分面试题!)以下附上代码
weakMap 的 key 必须是对象,通过将源obj当key,cloneObj为value储存起来,判断是否应该return
我只是先存起来,等我再思考一下再优化,勿喷,刚学前端3个月