亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

es6的const定義的常量不能更改該怎么理解?

es6的const定義的常量不能更改該怎么理解?

滄海一幻覺 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}這一部分去哪里了呢? 被垃圾回收給清除了


查看完整回答
反對 回復 2019-03-08
?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

1,如果是值類型,值不可變
2.如果是引用類型,地址不可變

查看完整回答
反對 回復 2019-03-08
  • 2 回答
  • 0 關注
  • 1270 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號