js 淺析棧記憶體和堆記憶體
阿新 • • 發佈:2020-08-06
我們都知道js中定義變數的方式有var、let、const,let和const是es6中新增定義變數的方式,具體特性這裡不再闡述。現在我們用const定義一個物件:
// const定義了一個obj物件 const obj = { a: 1, b: 2} // 改變obj的值會報錯 obj = {}; // 這樣卻可以成功 obj.a = 2; console.log(obj.a);
可以看到如果直接給obj賦值為一個新物件,這時會因為const的限制報錯,但是去改變obj裡面的某個屬性值卻可以成功,為啥?下面來講講:
js中有棧記憶體和堆記憶體,棧記憶體主要是儲存一些有固定大小或者有大小限制的值,堆記憶體主要是儲存一些大小不定,動態分配大小的值。
js裡面基本資料型別有String、Boolean、Number、null、undefined、symbol,引用資料型別有Array、Object、Date、RegExp等。我們在定義基本資料型別的值時,js會把它的值儲存進棧記憶體中,可以直接去改變它的值,而當我們定義一個引用資料型別時,此時是分為兩個步驟,首先因為我們的值大小是不固定的,所以需要存進堆記憶體中,其次js會建立一個指標(也就是一個key,對應堆記憶體中的值),指向存進去的這塊資料,然後把這個指標存進棧記憶體中,通俗講就是js在棧記憶體中儲存了當前引用資料型別的堆記憶體地址,我們使用某個物件時其實是通過這個記憶體地址去引用堆記憶體中的值。
現在我們再來解釋上面const的問題,const表示我們不能去改變棧記憶體中的值,但是堆記憶體中的值卻可以改變。