浅拷贝是地址引用,当其中一个对象变化时,另外一个对象跟着变化;
深拷贝在创建对象时分配内存地址,现对象变化与原对象无关。
实现深拷贝的几种方法:
1. 递归
function deepClone(obj){
let data;
if(Object.prototype.toString.call(obj)==='[Object Array]'){
data=[];
for(let index=0;index<obj.length;index++){
data.push(deepClone(obj[index]));
}
}else if(Object.prototype.toString.call(obj)==='[Object Object]'){
data={};
for(let key in obj){
data[key]=deepClone(obj[key]);
}
}else{
return obj;
}
return data;
}
缺点 :无法拷贝函数,无法拷贝原型链的属性和方法(Date、RegExp、Error)
2. 序列化与反序列化 (日常开发常用)
function deepClone(obj){
return JSON.parse(JSON.strigify(obj))
}
缺点:只能拷贝数组和对象,不能拷贝函数,无法拷贝原型链的属性和方法(Date、RegExp、Error)
3. 其他方法不能完全深拷贝,大多数情况用于浅拷贝
slice()、concat()、Object.assign({}, a) ---当对象中只有一级属性时,为深拷贝;当对象中有对象时,为浅拷贝
$.extend(true,目标对象,被合并的对象) --- 当对象中只有一级属性时,为深拷贝;当对象中有对象时,为浅拷贝
--- true 为深拷贝、false 为浅拷贝