2017年1月4日

[筆記] JavaScript ES6 中使用 const 宣告常數


在 ES6 中可以透過 const 來宣告變數,究竟 const 有什麼特別的地方呢?

首先 const 的意思是 constant ,也就是常數的意思,當我們宣告它之後,它是不能在被改變的,但實際上在使用時仍然有一些需要注意的地方,讓我們先來看一下下面的例子:

當我們使用 const 來宣告變數時,就像和使用 let 一樣,都可以得到 27 的結果:


可是當我對這個 const 重新指派值時,就會出現錯誤訊息:


也就是說 age 它在這裡其實是被設定成一個常數,而不是一個變數。 透過 const 我們可以宣告常數

因此,為了方便區分哪些是常數那寫是變數,我們可以把常數在宣告的時候用大寫來表示,像是這樣:


使用 const 在宣告陣列或物件時需要留意的地方


這麼看起來 const 似乎很容易理解,但是有幾種狀況必須非常小心,當 const 使用在陣列(array)或物件(object)的時候需要特別留意,讓我們來看一下使用在陣列的情況:

當我們已經使用 const 宣告好一個常數,接著在用 push 去推入一個陣列的值時,並不會有錯誤的情形產生。


之所以不會有錯誤,是因為在 JS 中陣列(array)和物件(object)都是屬於 reference type,因此實際上我們並沒有把這個常數指向(pointer)另一個東西,它仍然指稱到的是同一個記憶體位置。

如果不清楚 by reference 的意思,可以參考:[筆記] 談談JavaScript中by reference和by value的重要觀念

同樣的道理,如果我們使用的是物件(object),一樣不會有錯誤的情形產生:


然而,還有一點需要提醒的是,如果你是使用 object literal 的方式修改物件的內容,那對於 JS 引擎來說,就等於是建立了一個新的物件,也就是它會將這個物件存到另一個記憶體位置,意思就是這個常數的值改變了,如此的話,同樣會出現錯誤的訊息(陣列也是一樣的道理):


const 和 let 一樣都是block-scoped


最後一點是 const 和 let 一樣,所宣告的變數都是僅在代碼區塊內有效(block-scoped),也就是僅在限定的{ }內有效:





0 意見:

張貼留言