js類型有兩種,一種是基本數據類型(null,undefined,Boolen,string,number,)和引用數據類型(array,object);
這兩種數據類型數據存放在另個不同的地方;基本數據類型在棧中,引用數據類型的值存在堆中,而他的值得地址會存在棧中。
當我們在直接賦值的時候賦值的是地址。
const a = {a:'haha'}
const b = a;
當 我們修改b中的值得時候 a 中的值也會隨之發生改變;
這就是因為我們直接賦值的時候賦值的是存在棧中的地址。他們都是指向同一個堆里的數據;b變化,a也就變化;
但是有時候我們不想讓a也發生變化,這時就會用到深拷貝和淺拷貝;
這里首先講一下淺拷貝;
這是我們發現,當arr變化並不會導致arr1變化;
接下來請睜大你的眼睛繼續看下去;
同樣是一份淺拷貝,但是當arr2中的是一個對象的時候,arr2的變化也會導致arr3的變化;
淺拷貝:對對象地址的復制,不會進行遞歸復制,並沒有開辟新的棧,也就是復制的結果是兩個對象指向同一個地址。
而深拷貝是將原對象和屬性一起賦值出去,復制到一份新的內存當中;二者不會有關聯;
深拷貝最常用的方法:JSON.parse(JSON.stringfiy());
這里arr1中的a對象並不會發生改變;
但是如果對象中含有function則會出現問題;
淺拷貝方法還有以下幾種; Array.from(), Array.slice(),Object,assigin({},[]),