生产中可以使用: circular-json 库来实现,避免JSON.stringify, JSON.parse处理循环报错的问题;实现原理是:转成序列化后,循环引用的对象使用一个特殊的字符器标记来代替,parse的过程再把标记转成要引用的那个对象(this)
deepCopy (obj) { var newobj = obj.constructor === Array ? [] : {}; if(typeof obj !== 'object'){ return; } for(var i in obj){ newobj[i] = typeof obj[i] === 'object' ? utils.deepCopy(obj[i]) : obj[i]; } return newobj }
生产中可以使用: circular-json 库来实现,避免JSON.stringify, JSON.parse处理循环报错的问题;
实现原理是:转成序列化后,循环引用的对象使用一个特殊的字符器标记来代替,parse的过程再把标记转成要引用的那个对象(this)
死循环是递归写得有问题。
深拷贝如果只是拷贝一些
数组
、json
数据,简单粗暴用:JSON.parse(JSON.stringify('xxxxxxx'))
死循环一般是copy过程中对象出现了循环引用自己。可以在递归过程中加个map存储copy过程中的对象,来应对可能出现的循环引用自己的情况。
不要滥用深拷贝,this也不应该被拷贝,需要拷贝的仅仅是部分数据,只深拷贝白名单中的部分数据就行。