Object.assign()
Object.assign()也只能实现一维对象的深拷贝
obj2 = Object.assign({}, obj1);
JSON.parse(JSON.stringify(obj))
JSON.parse(JSON.stringify(obj))的使用也是有局限性的,不能深拷贝含有undefined、function、symbol值的对象
var obj2 = JSON.parse(JSON.stringify(obj1));
递归深拷贝
// 深拷贝封装
function deep (obj, parent=null){
// 创建一个新对象
let result ={}
let keys = Object.keys(obj)
key=null;
temp=null;
_parent = parent;
// 该字段有父级则需要追溯该字段的父级
// 该字段有父级则需要追溯该字段的父级
while (_parent) {
// 如果该字段引用了它的父级则为循环引用
if (_parent.originalParent === obj) {
// 循环引用直接返回同级的新对象
return _parent.currentParent;
}
_parent = _parent.parent;
}
for (let i = 0; i < keys.length; i++) {
key = keys[i];
temp= obj[key];
// 如果字段的值也是一个对象
if (temp && typeof temp=== 'object') {
// 递归执行深拷贝 将同级的待拷贝对象与新对象传递给 parent 方便追溯循环引用
result[key] = deep(temp, {
originalParent: obj,
currentParent: result,
parent: parent
});
} else {
result[key] = temp;
}
}
return result;
}
var obj1 = {
x:1,
y:2,
list:{a:'a'}
,b:''
,c:undefined
};
// obj1.z=obj1;
var obj2 =deep(obj1)
obj1.list.a='b'
obj1.b=undefined
obj1.x=12
obj2.x=13
console.log(obj1,obj2)