【いみゅーたぶる】

イミュータブル とは?

最終更新:
💡 「一度刻んだら変えられない」石碑のようなデータ

一度作った値やデータを変更できない性質のこと。更新するときは元を変更せず、新しい値やオブジェクトを作る。共有されたデータの意図しない書き換えを防ぐ設計にも役立つ。

📌 このページのポイント
元を書き換える? 新しく作る? 中身を変更 元を変更しない 1 2 1 2 push(3) 別の配列を作る 1 2 3 1 2 3 同じ配列の中身が変化 元の [1, 2] は保つ constでも配列の中身は変更できる 右は配列をイミュータブルに扱う更新の例
左は同じ配列の中身を変更し、右は元の配列を保って新しい配列を作ります。JavaScriptの通常の配列が自動で変更不能になるわけではありません。
ひよこ ひよこ
イミュータブルって何のために使うの?
ペンギン先生 ペンギン先生
一度作った値やデータが変わらない性質のことだよ。更新するときは新しいものを作る。同じオブジェクトを複数の場所から参照していると、一方で中身を変えると他方にも影響する。元を変更しない設計なら、こうした意図しない書き換えを避けやすくなるんだ。
ひよこ ひよこ
JavaScriptのconstも同じ意味?
ペンギン先生 ペンギン先生
constが禁止するのは、変数への再代入だよ。たとえば「const obj = {a: 1}」でも、obj.a = 2と中身を変更できる。文字列や数値そのものはイミュータブルだけれど、通常のオブジェクトや配列は変更可能なんだ。
ひよこ ひよこ
Object.freeze()を使えば、全部変えられなくなる?
ペンギン先生 ペンギン先生
そのオブジェクト自身のプロパティは追加・削除・変更できなくなるけれど、凍結は浅いよ。プロパティが指す入れ子のオブジェクトまで、自動で凍結するわけではない。スプレッド構文によるコピーも浅いので、入れ子の更新では変更する部分まで新しく作る必要があるんだ。
ひよこ ひよこ
毎回データ全体をコピーすると重くならない?
ペンギン先生 ペンギン先生
データの大きさや更新方法によるよ。変えない部分を元のデータと共有する「構造的共有」で、全体のコピーを避ける方法もある。Immerは、その仕組みを使いながら更新を書きやすくするライブラリの例だよ。ただし、いつでも軽くなるとは限らず、必要なら実際の処理で測定しよう。
ひよこ ひよこ
Reactでも元のstateを変更しないのはなぜ?
ペンギン先生 ペンギン先生
以前のstateを保ち、新しいstateをsetterに渡して更新を伝えるためだよ。直接書き換えるだけでは再描画が起きず、過去のstateも変わってしまう。Reactがすべてのオブジェクトを変更不能にするわけではないので、元を変更せず新しいオブジェクトを作る扱い方が大切なんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「イミュータブル」って出てきたら「元を変えず、更新には新しい値やデータを作る」と思えばだいたいOK!
📖 おまけ:英語の意味
「Immutable」 = 変更不可能な
💬 「im(否定)+ mutable(変化できる)」。反対語はミュータブル(mutable・変更可能)

参考資料

← 用語集にもどる