一、淺拷貝只拷貝一層,更深層次對象級別的只拷貝引用;所以改變新對象的屬性值時,會改變原對象。
Object.assign(target,...sources) 是es6新增方法進行淺拷貝;
二、深拷貝拷貝多層,每一級別的數據都會拷貝;所以改變新對象的屬性值時,不會改變原對象。
簡便方法:JSON.parse(JSON.stringify(obj))
使用JavaScript實現淺拷貝和深拷貝:
被拷貝對象:obj,拷貝對象:o,即:拷貝obj對象,使對象o具備obj對象的屬性名與屬性值。
一個小知識點:在改變對象 o 的一個屬性前 console.log() 輸出對象o,發現輸出的對象 o 是改變後的值。因爲 console.log()輸出 對象時,點擊控制檯的小倒三角 會獲取該對象的最新狀態。—— 對比:在對象屬性值改變前console.log()輸出該對象將改變的值仍然是以前的值。(具體參考第一條淺拷貝的代碼及輸出圖)
1、淺拷貝
1)使用循環對象進行拷貝
//淺拷貝
var obj={
id:1,
name:'lee',
msg:{
age:18
},
color:['red','blue']
}
var o={};
console.log('——————————一般淺拷貝——————————')
for(var k in obj){// k:屬性名 , obj[k]:屬性值
o[k]=obj[k];
}
console.log(o)//點擊三角後獲取最新數據
console.log(o.msg.age);
o.msg.age=20;
console.log(obj);
輸出:
2)使用ES6新增方法 assign() 進行拷貝
//淺拷貝
var obj={
id:1,
name:'lee',
msg:{
age:18
},
color:['red','blue']
}
var o={};
console.log('——————————ES6新增淺拷貝方法——————————')
Object.assign(o,obj);
console.log(o)
o.msg.age=20;
console.log(obj);
輸出:
2、深拷貝
使用了遞歸函數實現深拷貝。
注意:先判斷屬性值是否屬於數組類型,再判斷是否屬於對象類型,因爲Array也屬於Object。
var obj={
id:1,
name:'lee',
msg:{
age:18
},
color:['red','blue']
}
var o={};
//深拷貝
console.log('——————————深拷貝——————————')
//封裝函數
function deepCopy(newobj,oldobj){
for(var k in oldobj){
//判斷屬性值是什麼數據類型
//獲取屬性值 oldobj[k]
var item=oldobj[k];
if(item instanceof Array){
//判斷是否是數組(先判斷,因爲數組也屬於Object)
newobj[k]=[];
deepCopy(newobj[k],item);
}else if(item instanceof Object){
//判斷是否是對象
newobj[k]={};
deepCopy(newobj[k],item);
}else{
//簡單數據類型
newobj[k]=item;
}
}
}
deepCopy(o,obj);
console.log(o);
o.msg.age=20;
console.log(obj);
輸出: