深拷貝和淺拷貝

summer_e發表於2020-03-26

如何區分深拷貝與淺拷貝,
假設B複製了A,修改A的時候,看B是否發生變化
如果B跟著也變了,說明是淺拷貝,拿人手短!(修改堆記憶體中的同一個值)
如果B沒有改變,說明是深拷貝,自食其力!(修改堆記憶體中的不同的值)

JavaScript的資料型別:
(1) 基本資料型別:數值、字串、布林、null、undefined (值型別)
(2) 複雜(複合)資料型別:物件 (引用型別)
基本資料型別儲存在棧記憶體,引用型別儲存在堆記憶體中。

淺拷貝

通常意義上,對 陣列 和 物件 的複製
特點:只是簡單的複製拷貝 引用資料型別的地址
地址相同的變數,操作引用的資料型別,彼此都會有影響

淺拷貝程式碼解釋:

1.引用型別的複製
執行原理
此時是 賦值arr1中儲存的陣列的記憶體地址
arr1和arr2中儲存的是相同的記憶體地址,指向的是一個相同的陣列
如果arr1和arr2對這個陣列做出修改,都會影響另一個變數的輸出
let arr1=[“pink”,“red”];
let arr2=arr1;
arr2[0]=“oranged”;
console.log(arr1);// [“oranged”, “red”]
console.log(arr2);// [“oranged”, “red”]

2.基本型別的複製
執行原理:賦值的時候,在棧記憶體中重新開闢記憶體,存放變數b,所以在棧記憶體中分別存放著變數a、b各自的值,修改時互不影響
var a = 1;
var b = a;//複製
console.log(b)//1
a = 2;//改變a的值
console.log(b)//1

深拷貝
概念:完整的複製拷貝 一個引用資料型別中的數值資料,到另一個引用資料型別中 兩個變數 是兩個的獨立的引用資料型別 是兩個獨立的儲存空間 一個變數操作 引用資料型別 不會影響另一個變數

深拷貝程式碼解釋
通過迴圈遍歷,獲取 arr3中的所有數值,複製拷貝在arr4中
此時arr4和arr3雖然數值相同,但是兩個獨立的引用資料型別,是兩個獨立的空間
此時arr4或者arr3 , 修改資料,不會對另一個引用資料型別造成影響
et arr3=[1,2,3,4,5];
let arr4=[];
arr3.forEach(function(item){
arr4.push(item);
})
arr4[0]=“北京”;
console.log(arr3);//[1, 2, 3, 4, 5]
console.log(arr4);//[“北京”, 2, 3, 4, 5]

相關文章