Immutable 的觀念

玩壞腦袋的東西。

其實就跟在 從 Object 的等號來真正理解變數 提到的概念很類似。

Immutable 不可變

除了物件以外的資料型態都是屬於「immutable」,就是值沒辦法被改變。

例如說:

1
2
3
var a = 'hello'
a.toUpperCase()
console.log(a) // hello

這樣寫是絕對沒辦法改變 a 的值的。就跟你沒辦法在 function 裡面去改外面變數的值是一樣的道理。這個就叫做「不可變」。

所以你絕對不會看到用 String.method() Number.method() 就可以原變數的值的東西,而都是用回傳的方式來產生一個新的值。

Mutable 可變

只有物件,陣列是可以被改變的,關鍵字:「Mutator methods」

一個最常見的例子:

1
2
3
4
var arr = [1, 2, 3]
var res = arr.push(1, 2)
console.log(arr) // 修改原陣列
console.log(res) // 回傳值

一個陣列使用 push 後原本的內容就會被改變。所以你不會用看到用第二行的寫法來,那樣子只會得到 push 執行完的回傳值(陣列的長度)。

其他還有像是 Array.spliceArray.sort() 也都是一樣的例子。

讓一個物件變成不可變的方法

Object.freeze(obj) 可以讓一個物件或陣列變成 immutable:

1
2
3
var arr = [1, 2, 3]
Object.freeze(arr)
arr.splice(1, 1, 'hi') // TypeError: Cannot assign to read only property '1' of object '[object Array]'

如果你真的有這種要讓「物件」變成不可變的需求,可以使用這個內建方法。(但我目前也不知道有什麼情況會需要這樣做就是了)

善用 console.log 來除錯 實作陣列內建函式
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×