什麼是深拷貝與淺拷貝
我們都知道在Js當中數據類型是分爲基本數據類型和引用數據類型,基本數據類型有Number、String 、Boolean、Null、Undefined這裏就不一一細說了,我們今天主要來說說引用類型的深拷貝與淺拷貝問題,引用類型Object,主要又分爲對象{},和數組[]。
在這裏我們又要引入一個知識點,就是棧內存跟堆內存,基本數據類型都是存儲在棧內存中的,而引用類型都是存儲在堆內存中的,看圖
如圖所示,棧內存拷貝之後是重新開闢了一個存儲空間,而堆內存拷貝則是相當於給予了一個通爲堆內存的鏈接地址,兩則之間的內容還是有聯繫的,如果改變一個值,另一個值也會改變,這樣會帶來許多不便,這時候我們就需要用深拷貝和淺拷貝這個兩個詞來解決這個問題。
1、淺拷貝
什麼是深拷貝與淺拷貝,簡單來講淺拷貝是隻能實現一維數組的拷貝,比如arr=[1,2,3,4,5,6],但是對二維或者多維數組就不行,比如arr=[1,[2,3,4],5,6,7],淺拷貝就不能讓數組裏的數組[2,3,4]改變兩者不影響,而深拷貝就能實現。
var arr1 = [1,2,3,4,5,6,7];
var arr2 = [];
for (var j = 0;j<arr1.length;j++){
arr2.push(arr1[j])
}
console.log(arr2);//[1, 2, 3, 4, 5, 6, 7]
關於淺拷貝如以上代碼所示一個簡單的for循環就能夠實現。
2、深拷貝
實現深拷貝可以套用for循環然後不斷遞歸來實現
function fm(arrx) {
var arry =[];
for (var k = 0;k<arrx.length;k++){
if (typeof arrx[k]==="object"){
arry[k]=new Array();
arry[k] = fm(arrx[k])
}else {
arry[k] = arrx[k];
}
}
return arry
}
var arrx = [[1,2,3],4,5,6,[7,8,[8,8,9]]];
var arr1122 = fm(arrx);
arrx[4][2][0]="ddd";
console.log(arrx);//1,2,3,4,5,6,7,8,ddd,8,9
console.log(arr1122);//1,2,3,4,5,6,7,8,8,8,9
還有的就是用Json來實現
arr1 = [[1,2,3],4,5,6,[7,8,[8,8,9]]];
var arrN = JSON.parse(JSON.stringify(arr1));
這樣arrN就重新生成了新的數組了。
還有一種就是用數組的slice的方法
var arr2 =[2,3,1,53,2,5];
var arr3 = arr2.slice(0);
通過切片的方式,arr3生成了一個新數組,數組就是arr2裏的內容。