You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functiondeepCopy(data){varresult={}for(varattrindata){if(typeofdata[attr]==='object'){result[attr]=deepCopy(data[attr]);}else{result[attr]=data[attr];}}returnresult}Object.prototype.father="I am your father"vara={a: 1,b: 2,c: {d: 1}}varsym1=Symbol("a");a[sym1]='sym1'varb=deepCopy(a);a.c.d=2console.log(a,b)
引用丢失在某些情况下是有问题的,比如上面的对象 obj2,obj2 的键值 a 和 b 同时引用了同一个对象 obj1,使用 deepCopy02进行深拷贝后就丢失了引用关系变成了两个不同的对象,deepCopy03和deepCopy04再解决循环引用的同时,已经解决了丢失的情况;(同一个对象被存储重复利用)
1.简单实现
深拷贝拆分之后是浅拷贝+递归;浅拷贝时判断属性值是否为对象,如果是对象就递归再进行拷贝;
打印结果分析:
2.改进(兼容数组,过滤原型链上的数据)
3.改进(拷贝Symbol)
4.循环引用
这里用了es6的 WeakMap,那么我们用数组来兼容
5.引用丢失
引用丢失在某些情况下是有问题的,比如上面的对象 obj2,obj2 的键值 a 和 b 同时引用了同一个对象 obj1,使用 deepCopy02进行深拷贝后就丢失了引用关系变成了两个不同的对象,deepCopy03和deepCopy04再解决循环引用的同时,已经解决了丢失的情况;(同一个对象被存储重复利用)
6.递归爆栈
递归的存在,会存在爆栈的情况;
参考
The text was updated successfully, but these errors were encountered: