js中的深拷貝和淺拷貝
阿新 • • 發佈:2020-07-24
js的儲存區
程式執行的時候,需要記憶體空間存放資料。一般來說,系統會劃分出兩種不同的記憶體空間:
- 棧(stack):
自動分配
的記憶體空間,大小和生存期是確定的,它由系統自動釋放,定址比堆快。棧中主要存放的是基本型別的值以及指向堆中的陣列或者物件的地址。 - 堆(heap) :
動態分配
的記憶體,大小不定也不會自動釋放。(因此需要瀏覽器提供的垃圾回收機制進行記憶體的回收,否則可能會導致記憶體洩漏)
PS 1:棧的資料共享
棧有一個很重要的特殊性,就是存在棧中的資料可以共享
假設我們同時定義 int a = 3; int b = 3;
,編譯器先處理 int a = 3;
首先它會在棧中建立一個變數為 a 的引用,然後查詢有沒有字面值為 3 的地址,沒找到,就開闢一個存放 3 這個字面值的地址,然後將 a 指向 3 的地址
接著處理 int b = 3;
,在建立完 b 的引用變數後,由於在棧中已經有 3 這個字面值,便將 b 直接指向 3 的地址。這樣,就出現了 a 與 b 同時均指向 3 的情況。
特別注意的是,這種 字面值的引用
與 類物件的引用
不同。假定兩個類物件的引用同時指向一個物件,如果一個物件引用變數修改了這個物件的內部狀態,那麼另一個物件引用變數也即刻反映出這個變化
相反,通過字面值的引用來修改其值,不會導致另一個指向此字面值的引用的值也跟著改變的情況。如上例,我們定義完 a 與 b 的值後,再令 a=4;
,那麼,b 還是等於 3
在編譯器內部,遇到 a=4;
時,它就會重新搜尋棧中是否有 4 的字面值,如果沒有,重新開闢地址存放 4 的值;如果已經有了,則直接將 a 指向這個地址。因此 a 值的改變不會影響到 b 的值
PS 2:
ssss
資料型別
- 基本資料型別:String、Number、Boolean、Symbol、Undefined、Null
- 引用資料型別:Object
基本資料型別(棧)
- 儲存在
棧
中 - 直接按
值
存放的,所以可以直接訪問。 - 在 JavaScript 中,
字串
的值是不可變的,這意味著一旦字串被建立就不能被改變(即:js中基本資料型別的值不可變)
PS:string型別
//示例1 var str = "hello"; str += "world"; console.log(str); //helloworld //示例2 var myStrNew = "Bob"; myStrNew = "Job"; console.log(myStrNew); //Job //示例3 var myStr = "Bob"; myStr[0] = "J"; console.log(myStr); //Bob
引用資料型別(堆)
儲存在 堆
中