搞不懂JS中賦值 淺拷貝 深拷貝的請看這裡

2022-06-30 16:30:14 字數 1018 閱讀 5497

百科定義:拷貝就是拷貝指向物件的指標,意思就是說:拷貝出來的目標物件的指標和源物件的指標指向的記憶體空間是同一塊空間,淺拷貝只是一種簡單的拷貝,讓幾個物件公用乙個記憶體,然而當記憶體銷毀的時候,指向這個記憶體空間的所有指標需要重新定義,不然會造成野指標錯誤。

閉包中的變數並不儲存在棧記憶體中,而是儲存在堆記憶體中。這一點比較好想,如果閉包中的變數儲存在了棧記憶體中,隨著外層中的函式從呼叫棧中銷毀,變數肯定也會被銷毀,但是如果儲存在了堆記憶體中,記憶體函式仍能訪問外層已銷毀函式中的變數。看一段對應**理解下:

function a() 

return b

}

基本資料型別複製配圖:

結論:在棧記憶體中的資料發生資料變化的時候,系統會自動為新的變數分配乙個新的之值在棧記憶體中,兩個變數相互獨立,互不影響的。

看一段**

let a = 

let b = a;

b.x = '程式設計師成長指北';

console.log(a.x); // 程式設計師成長指北

引用型別的複製,同樣為新的變數b分配乙個新的值,報錯在棧記憶體中,不同的是這個變數對應的具體值不在棧中,棧中只是乙個位址指標。兩個變數位址指標相同,指向堆記憶體中的物件,因此b.x發生改變的時候,a.x也發生了改變。

淺拷貝定義:

通過這個官方的slice淺拷貝函式分析淺拷貝定義

新的物件複製已有物件中非物件屬性的值和物件屬性的引用。如果這種說法不理解換一種乙個新的物件直接拷貝已存在的物件的物件屬性的引用,即淺拷貝。
說了賦值操作和淺拷貝操作,大家是不是已經能想到什麼是深拷貝了,下面直接說深拷貝的定義。

深拷貝會另外拷貝乙份乙個一模一樣的物件,從堆記憶體中開闢乙個新的區域存放新物件,新物件跟原物件不共享記憶體,修改新物件不會改到原物件。

JS賦值 淺拷貝和深拷貝

賦值 當我們把乙個物件賦值給乙個新的變數時,賦的其實是該物件在棧中的位址,而不是堆中的資料。也就是兩個物件指向同乙個內儲存空間,無論哪個物件發生改變,其實都是改變儲存空間的內容,因此兩個物件是聯動的 var person console.log person var person1 person p...

淺拷貝 深拷貝和淺賦值 深賦值

include includeusing namespace std class string else 淺拷貝 也就是系統預設的拷貝,可寫可不寫。string const string s 預設的拷貝構造 深拷貝 string const string s string s2 s1 深賦值 str...

賦值 淺拷貝 深拷貝

堆是動態分配記憶體,記憶體大小不一 棧是自動分配相對固定大小的記憶體空間,並由系統自動釋放 基本資料型別值是不可變的,比較是值的比較 基本資料型別,傳值。開闢乙個新的記憶體空間 js 基本資料型別,儲存在 棧 中,記憶體可以及時 引用型別值是可變的,比較是引用的比較,看其引用是否指向同乙個物件 引用...