在es6中,可以使用const關鍵字來宣告只讀常數,語法「const 常數名稱 = 常數值;」;一旦聲明,常數必須初始化且初始化的值就不能改變。 const聲明的常數屬於區塊作用域,受到「暫存死區」的約束,不會在window上建立任何全域屬性,不可重新分配,且不可重新宣告。
本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。
在es6中,可以使用const關鍵字來宣告只讀常數。
es6 const關鍵字
const宣告一個只讀的常數。一旦聲明,常數必須進行初始化且初始化的值就不能改變。
const PI = 3.1415; PI // 3.1415 PI = 3; // TypeError: Assignment to constant variable.
const 常數遵守下列規則:
是屬於區塊作用域的。
受到「暫存死區」的約束。
它不會在 window 上建立任何全域屬性。
不可重新分配。
不可重新宣告。
const一旦宣告變量,就必須立即初始化。
const foo; // SyntaxError: Missing initializer in const declaration
上面程式碼表示,對於const來說,只宣告不賦值,就會報錯。
const的作用域與let指令相同:只在宣告所在的區塊層級作用域內有效。
if (true) { const MAX = 5; } MAX // Uncaught ReferenceError: MAX is not defined
const指令宣告的常數也是不提升,同樣存在暫時性死區,只能在宣告的位置後面使用。
if (true) { console.log(MAX); // ReferenceError const MAX = 5; }
上面程式碼在常數MAX宣告之前就調用,結果報錯。
const宣告的常數,也與let一樣不可重複宣告。
var message = "Hello!"; let age = 25; // 以下两行都会报错 const message = "Goodbye!"; const age = 30;
const本質
const實際上保證的,並不是變數的值不得改動,而是變數指向的那個記憶體位址所保存的資料不得改變。對於簡單類型的資料(數值、字串、布林值),值就保存在變數指向的那個記憶體位址,因此等同於常數。但對於複合類型的資料(主要是物件和陣列),變數指向的記憶體位址,保存的只是指向實際資料的指針,const只能保證這個指標是固定的(即總是指向另一個固定的位址) ,至於它所指向的資料結構是不是可變的,就完全不能控制了。因此,將一個物件聲明為常數必須非常小心。
const foo = {}; // 为 foo 添加一个属性,可以成功 foo.prop = 123; foo.prop // 123 // 将 foo 指向另一个对象,就会报错 foo = {}; // TypeError: "foo" is read-only
上面程式碼中,常數foo儲存的是一個位址,這個位址指向一個物件。不可變的只是這個位址,即不能把foo指向另一個位址,但物件本身是可變的,所以依然可以為其添加新屬性。
下面是另一個例子。
const a = []; a.push('Hello'); // 可执行 a.length = 0; // 可执行 a = ['Dave']; // 报错
上面程式碼中,常數a是一個數組,這個數組本身是可寫的,但是如果將另一個數組賦值給a,就會報錯。
如果真的想將物件凍結,應該使用Object.freeze方法。
const foo = Object.freeze({}); // 常规模式时,下面一行不起作用; // 严格模式时,该行会报错 foo.prop = 123;
上面程式碼中,常數foo指向一個凍結的對象,所以新增屬性不起作用,嚴格模式時還會報錯。
除了將物件本身凍結,物件的屬性也應該凍結。下面是一個將物件徹底凍結的函數。
var constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key, i) => { if ( typeof obj[key] === 'object' ) { constantize( obj[key] ); } }); };
【相關推薦:javascript影片教學、程式設計影片】
以上是es6怎麼聲明只讀常數的詳細內容。更多資訊請關注PHP中文網其他相關文章!