JavaScript中的深拷貝與淺拷貝

js中的內存分爲棧內存與堆內存

棧內存的六種數據類型:String Number Boolean undefined null Symbol
棧內存會開闢出一個新的空間存放數據,因此當a的值發生變化時,b的值不會改

let a = 10;
let b = a;
a = 20

b的值不會改,依舊還是10

堆內存的三種數據類型: Object Array Function
堆內存數據的複製只是指向了同一個存放數據的地址,所以當改變其中一個的時候,所有的都會改變,這就是淺拷貝
例如:

 let a = [1, 2, 3, 4];
 let b = a;
 a[0] = 5;
 console.log(b);

會發現b變成了[5, 2, 3, 4];

深拷貝: 拷貝對象各個層級的屬性,也就是新的對象擁有新的內存,不再互相影響
可用js中JSON.stringify()和JSON.parse()來實現深拷貝
原理就是先利用JSON.stringify()將對象轉變成基本數據類型,然後使用了基本類型的拷貝方式,再利用JSON.parse()將這個字符串還原成一個對象完成深拷貝
例如:

 let a = [1, 2, 3, 4];
 let strA = JSON.stringify(a);
 let b = JSON.parse(strA);       
 a[0] = 5;
 console.log(b);

此時b就不會發生改變依舊是[1, 2, 3, 4]

可將其封裝爲一個函數

function deepCopy(obj) {
	return JSON.parse(JSON.stringify(obj));
}
	   
let b = deepCopy(a);

即可完成深拷貝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章