JavaScript有七種數據類型
- 基本數據類型:null、undefined、number、string、BigInt、Symbol
- 引用數據類型:Object
基本數據類型是存在棧內存中的,因為長度小,使用頻率高
而引用數據類型占用的空間大且不定,所以是用指針將引用數據類型的地址存下來放在棧中
const保證的是變量指向的地址不變,引用數據類型存的是指針,指向實際對象存儲在堆中的地址,改變對象中的值不會改變指針指向的地址,所以const聲明的對象是可以改變的
而基本數據類型,變量直接指向存著值的地址,所以視為常量
這裡困擾了我很久,應該怎麼理解呢
首先從一個例子說起
var a = 1;
var b = 1;
a === b; // true
第一行聲明了一個a,並且賦了一個1的值,檢查棧中有沒有1的值,沒有就將1放入棧中,並把地址分給a,使a指向1的地址
現在棧中有1,地址為零,a指向地址0
stack
0| 1 | a
--------------
1| |
--------------
2| |
--------------
第二行聲明了一個b,一樣賦了1值,檢查棧中有沒有1的值,發現有,於是把地址分給b,使b指向1的地址
stack
0| 1 | a b
--------------
1| |
--------------
2| |
--------------
於是第三行的a === b
為true
現在將a的值改成3,棧中沒有3的值,將3放入棧中,把a的值改成地址1
a = 3;
stack
0| 1 | b
--------------
1| 3 | a
--------------
2| |
--------------
內存中的值是不會更改的,在更改值時,只會寫入新的值,而用不到的值會在JS回收機制中被清除