天天看點

【深拷貝】與【淺拷貝】

(例題講解)

var a = { name: “lucy” };

var b = a;

b.name = “lily”;

b.age = 20;

console.log(a);

console.log(b);

此時浏覽器控制台輸出應為:

【深拷貝】與【淺拷貝】

為什麼此時 a 和 b 輸出結果一樣呢?

實際上将對象指派給 a ,是将對象的位址指派給 a,根據這個這個位址我們可以找到這個對象,

将 a 指派給 b ,實際上是将 a 中儲存的記憶體位址,複制一份給 b ,此時我們可以知道:a ,b指向 的是同一個對象,根據 b 的位址找到的對象,并修改對象,對象改變,是以,此時 a , b,指向的都是這個已經被修改過的對象,此解釋涉及【深拷貝】,【淺拷貝】,說到【拷貝】,又得扯到【記憶體】。

記憶體:

記憶體分為**【棧記憶體】和【堆記憶體】**

1.隻要我們聲明一個變量,就會在【棧】中占一個記憶體,,基本資料類型的【VAR】在【棧】中,直接提供給變量;

2.引用類型的數值,資料與基本資料類型不同,它是存在【堆】中,與此同時提供給【棧】一個位址,指向的是【堆】中的資料;

注意:【棧】中的變量,如果有多個【變量】指向同一個位址,擷取到的是【同一個堆記憶體中資料】,任何一個變量發生變化時都會影響到【其他的變量】;

拷貝:

拷貝分為:【深拷貝】 【淺拷貝】

1.1 深拷貝:(抄襲者):當【抄襲者】資料改變時,不會改變【被抄襲者】中的内容,同時,當【被抄襲者】中的資料發生改變時,亦不會影響到【抄襲者】中資料,說明【抄襲者】可以自食其力。

1.2深拷貝:拷貝的是資料,JS中基本資料類型都是【深拷貝】,因為基本資料類型都存在【棧中】

2.1淺拷貝:拷貝後,【抄襲者】和【被抄襲者】互相影響

2.2淺拷貝:拷貝的是指針,JS中引用資料類型都是淺拷貝,因為引用類型都存在【堆中】

而我們之前所介紹的題目就屬于【淺拷貝】,是以才會導緻【a】和【b】在控制台輸出的結果一緻。