對(duì)于基本類型的數(shù)據(jù)我們直接重新定義變量就可以,但是對(duì)于引用類型的數(shù)據(jù)如果我們需要保持原有的數(shù)據(jù)不被更改,我們需要一些特殊的處理,讓他們指向不同的地址.
如果是簡(jiǎn)單的純屬組類型比如數(shù)組中是數(shù)字,字符串類型,可直接通過slice,concat實(shí)現(xiàn)深拷貝.
如果是對(duì)象的話處理會(huì)比較麻煩,我們平時(shí)經(jīng)常用的方法比如通過new Object(),Object.assign(),es6的擴(kuò)展運(yùn)算符等其實(shí)都是淺拷貝,他們還是指向的一個(gè)地址,改變對(duì)象中的引用類型的值,另一個(gè)也會(huì)改變.
通過JSON.stringify()實(shí)現(xiàn)深拷貝
var obj1 = {
name: "jock",
age: 20,
arr: [1,2,3]
}
var obj2 = JSON.stringify(obj1);
obj2 = JSON.parse(obj2);
obj2.name = "tom";
obj2.arr[1] = "dfy"
console.log(obj1,obj2);
1.png
發(fā)現(xiàn)這種方式是可以的,但是這種方法有個(gè)弊端,就是對(duì)象中不能有方法和正則表達(dá)式.所以如果需要一個(gè)公共的方法我們需要自己通過遞歸實(shí)現(xiàn)深拷貝.
遞歸實(shí)現(xiàn)深拷貝
function deep(obj1,obj2){
for(var key in obj2){
if(typeof obj2[key] == "object"){
obj1[key] = obj2[key].constructor == Array ? [] : {}
deep(obj1[key], obj2[key])
}else{
obj1[key] = obj2[key]
}
}
return obj1;
}
我們來測(cè)試一下上面的方法
var obj3 = {
name: "lilei",
age: 20,
fuc: function(){
console.log(10)
},
arr: [1,2,3,4,5,6]
}
var obj4 = deep({},obj3);
obj4.age = 100;
obj4.arr[0] = 100;
console.log(obj3,obj4)
2.png