【JS學習筆記】Const (常數)

最後更新於 2021 年 6 月 29 日

ES6(ECMAScript 6)提供了一種使用 const(constant) 聲明常數的新方法。你必須在宣告常數的同一個敘述式中指定這個常數的值,並且聲明的常數不能重新賦值

const year = 2015; 
console.log(year);  // 2015 
year = 2020; 
console.log(year);  // Uncaught TypeError: Assignment to constant variable. 
const year = 2021; 
console.log(year);  // Uncaught SyntaxError: Identifier 'year' has already been declared

宣告 const 會對於它的值建立一個唯讀的參考。並不是說這個值不可變更,而是這個變數不能再一次指定值。例如,假設常數的內容(值)是個物件,那麼此物件的內容(物件的參數)是可以更改的。

const number = 42;
try {
  number = 99;
} catch(err) {
  console.log(err);
  // expected output: TypeError: invalid assignment to const `number'
  // Note - error messages will vary depending on browser
}
console.log(number);
// expected output: 42
// TypeError: Assignment to constant variable.
// 42

要注意的是,const 和 let 都屬於 block-scoped ,也就是聲明的常數/變數只在區塊內有效↓

// const
if (true){
const age = 20;
}
console.log(age); // Uncaught ReferenceError: age is not defined
// let
if (true){
let age = 20;
}
console.log(age); // Uncaught ReferenceError: age is not defined
// var
if (true){
var age = 20;
}
console.log(age); // 20

備註

1. 在相同的可視範圍內,常數不能和函數,變數具有相同名稱。

2. 常數可以宣告成大寫或小寫,但習慣上使用全部大寫的字母,並用底線_來分隔字。

// 定義一個常數 MY_FAV 並賦予它的值為7
const MY_FAV = 7;
// 這裡會發生錯誤 - Uncaught TypeError: Assignment to constant variable.
MY_FAV = 20;
// MY_FAV 是 7
console.log('我喜歡的數字是: ' + MY_FAV);
// 嘗試重複宣告同名的常數,將會發生錯誤 -  Uncaught SyntaxError: Identifier 'MY_FAV' has already been declared
const MY_FAV = 20;
// MY_FAV 這個名稱已經保留給上面的常數, 所以這裡也會錯誤。
var MY_FAV = 20;
// 這式子也會錯誤
let MY_FAV = 20;
// 很重要,請注意區塊可視範圍的特性。
if (MY_FAV === 7) {
    // 以下式子沒有問題,並且會建立一個名叫 MY_FAV 的具有區塊可視範圍的變數。
    // (等同於使用 let 來宣告一個具有區塊可視範圍的非常數變數。)
    let MY_FAV = 20;
    // MY_FAV 現在變成 20
    console.log('我喜歡的數字是:' + MY_FAV);
    // 這會將變數懸掛於全域,而導致錯誤。(與常數同名)
    var MY_FAV = 20;
}
// MY_FAV 仍然是 7
console.log('我喜歡的數字是:' + MY_FAV);
// 發生錯誤 - Uncaught SyntaxError: Missing initializer in const declaration
const FOO;
// 常數的值可以是一個物件
const MY_OBJECT = {'key': 'value'};
// 嘗試覆寫該物件將會發生錯誤 - Uncaught TypeError: Assignment to constant variable.
MY_OBJECT = {'OTHER_KEY': 'value'};
// 然而, 物件的屬性並沒有被保護,
// 所以,以下敘述式沒有問題。
MY_OBJECT.key = 'otherValue'; // Use Object.freeze() to make object immutable
// 對陣列來說也是一樣
const MY_ARRAY = [];
// 可以把項目加到陣列中。
MY_ARRAY.push('A'); // ["A"]
// 然而,對這個變數指定新陣列,將會發生錯誤 - Uncaught TypeError: Assignment to constant variable.
MY_ARRAY = ['B'];

因應ES6的出現,使用上建議大家不要再用var來宣告變數,改用let與const,而且優先使用const。因為const在宣告時必須給定值,並且不能再被更改,這可以有效降低出現錯誤的機會。同理,如果是需要變更的數值則改用作用範圍較小的let做宣告,來減少錯誤出現的機率,Ex: for迴圈。

推薦閱讀[筆記] JavaScript ES6 中使用 const 宣告常數
JavaScript 宣告: var、let、const

0 0 評分數
Article Rating
訂閱
通知
guest

0 Comments
在線反饋
查看所有評論