滄海一幻覺
2019-02-26 21:40:54
在看const定義常量的時候發現,const定義基本類型的時候,再改變該值會報錯,但是定義對象或數組的時候,對象和數組改變卻不會報錯,es6里的解釋是const保存的是指向數組或對象的指針。我又搜了下棧內存和堆內存,發現其實變量保存的基本類型和引用類型的指針都是放在棧內存里的,const實質是不是就是棧內存不能變,而對象和數組的指針存在棧內存里沒變,但是存在堆內存的數據本體隨便更改是沒事的?
2 回答

慕標5832272
TA貢獻1966條經驗 獲得超4個贊
跟堆與棧沒有關系, 真正的區別在于簡單數據類型和引用數據類型的差異
假設有兩個變量a 和obj,分別是Number和Object類型
var a = 2
var obj = {
prop: 5
}
嚴格來說, JS并沒有區分什么數據類型放在堆,什么數據類型放在棧(不過你可以這么想, 這里我們就假設簡單數據類型是在棧,引用數據類型是在堆)
整個內存的分配你可以這么假想(實際的比這復雜得多):
對于a, 就是棧上存一個a變量, a存儲的值為2
對于obj,可以拆分成兩部分, 一部分是堆中(也就是{prop: 5})這一部分, 另一部分在棧中(obj這一部分)。
這里我們不分析堆中的, 只管棧這一部分,那么obj可以看成是一個存儲這地址的“簡單數據類型”(因為一個地址占的字節數和簡單數據類型差不多),obj的值為0x10000000這樣
假設執行obj.prop = 6, 實際上是改變了{prop: 5}這一部分, 而obj的值并沒有改變。依然是0x10000000, 數組的原理與之類似
當你執行obj = {key: 'foo'}, 是在堆中開辟了一個新的對象,然后把地址賦給了obj, 那obj的值肯定就變了, 那以前{prop: 5}這一部分去哪里了呢? 被垃圾回收給清除了
添加回答
舉報
0/150
提交
取消