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);
即可完成深拷貝