淺拷貝:只能拷貝一層 & 對于基本類型是值拷貝枣接,對于引用類型是引用拷貝
深拷貝:可以拷貝多層 & 對于引用類型可以賦值值
淺拷貝方法:
1纳决、
for(var attr in a ){
b[attr] = a[attr]
}
}
2盹舞、只用于對象
Object.assign()
也可以用于對象的合并娄昆,對于相同屬性泽西,會將原值覆蓋
深拷貝方法:
1晃痴、通用残吩,遞歸方法
function deepCopy(a,b){ //a:source b:target
for(var attr in a){
var item = a[attr]; //取出被拷貝對象的屬性數(shù)據(jù),進行判斷是否是引用數(shù)據(jù)進行拷貝
if(item instanceof Array){
b[attr] = [];//這個空數(shù)組 就是我們暫存數(shù)據(jù)的地方倘核,開辟新堆存數(shù)據(jù)泣侮,實現(xiàn)深拷貝
deepCopy(item,b[attr]);
}else if(item instanceof Obejct){
b[attr] = {};
deepCopy(item,b[attr])
}else{
b[attr] = item;
}
}
}
2紧唱、json.parse(json.stringify(obj))
缺點:對于以下情況會失效
(1)如果obj里面有時間對象活尊,則JSON.stringify后再JSON.parse的結(jié)果,時間將只是字符串的形式漏益。而不是時間對象
(2)如果obj里有RegExp蛹锰、Error對象,則序列化的結(jié)果將只得到空對象
(3)如果obj里有函數(shù)绰疤,undefined铜犬,則序列化的結(jié)果會把函數(shù)或 undefined丟失
(4)如果obj里有NaN、Infinity和-Infinity,則序列化的結(jié)果會變成null
(5)如果obj中的對象是有構(gòu)造函數(shù)生成的癣猾, 則使用JSON.parse(JSON.stringify(obj))深拷貝后敛劝,會丟棄對象的constructor;
(6)如果對象中存在循環(huán)引用的情況也無法正確實現(xiàn)深拷貝纷宇;
參考:
1夸盟、深拷貝、淺拷貝方法:https://zhuanlan.zhihu.com/p/490911572
2呐粘、json.parse(json.stringify)缺點:https://blog.csdn.net/Amnesiac666/article/details/122412248