ES6中的常量宣告 const關鍵字

2021-08-07 20:34:27 字數 1149 閱讀 2969

之前一直沒有仔細想過const這個常量宣告,有時候遇到了明顯的問題,竟然忽略了過去,最終的結論是——const宣告的常量是不能改變的,這句描述是並不太準確的。

很多時候,常量宣告用來宣告乙個固定的不變的資料,比如圓周率pi。

const pi = 3.14;

pi; // 3.14

pi = 3; // typeerror: assignment to constant variable.

測試結果很顯然的說明通過const關鍵字宣告的識別符號是無法改變值的。

但是很多時候,也經常會在各種**中看到const obj = {}類似這樣的物件常量,結果這樣明明也是常量宣告的資料,卻依然可以通過obj.x = 1這樣的語句給該物件新增屬性或方法。如此,const關鍵字宣告的常量的值無法改變這句話就變得不再可信了。

於是有了猜測,const關鍵字宣告的常量的指標不能發生改變。

const obj = {};

obj.n = 123;

obj; //

obj = ; // typeerror: assignment to constant variable.

在物件中新增屬性,是在堆中該物件的資料裡新增資料,而沒有改變obj中存放的指向該物件的位址,所以是可以執行成功的,而對obj重新賦值的操作則改變了obj的指標指向,故而操作失敗,丟擲錯誤。

對於基本型別也是同樣,因為基本型別的資料直接就存放在棧中,常量名直接指向這個位址上的資料,一旦改變值,就會導致指標位址發生改變,所以造成了無法改變值的假象。

因為本人是個新人,對自身能力不夠自信,所以還查詢了下其他的資料,在阮一峰老師寫的《ecmascript6 入門》中的const命令 中「本質」有講:

const實際上保證的,並不是變數的值不得改動,而是變數指向的那個記憶體位址不得改動。對於簡單型別的資料(數值、字串、布林值),值就儲存在變數指向的那個記憶體位址,因此等同於常量。但對於復合型別的資料(主要是物件和陣列),變數指向的記憶體位址,儲存的只是乙個指標,const只能保證這個指標是固定的,至於它指向的資料結構是不是可變的,就完全不能控制了。因此,將乙個物件宣告為常量必須非常小心。

看到這些,心裡終於有譜了,趕緊記錄下來。

ES6常量宣告方式 const

今天就來聊聊es6常量的宣告方式。在es5中定義乙個常量 object.defineproperty window,pi console.log pi 5console.log pi 在es6中定義乙個常量 典型報錯 const a 5a 6 報錯,常量不可以改變 const b 報錯,常量必須賦初...

es6的常量的宣告

在 es6 中里也可以使用 const 語法進行宣告。使用 const 宣告的變數會被認為是常量 constant 意味著它們的值在被設定完成後就不能再被改變。正因為如此,所有的 const 變數都需要在宣告時進行初始化,示例如下 有效的常量 const maxitems 30 語法錯誤 未進行初始...

ES6 變數 常量宣告總結

較之前es5,新版本在宣告上有改變,現根據文件教程,總結下不同之處,時長溫習。let只在命令所在的 塊 裡有效 es5只有全域性作用域和函式作用域,沒有塊級作用域,帶來很多不合理的場景,比如 第一種場景,內層變數可能會覆蓋外層變數。var tmp new date function f f unde...