【いみゅーたぶる】

イミュータブル とは?

💡 「一度刻んだら変えられない」石碑のようなデータ
📌 このページのポイント
ミュータブル vs イミュータブル ミュータブル(変更可能) data = [1,2] 直接変更 data = [1,2,3] 同じ変数を 上書き ⚠ 元の値が失われる 変更履歴が追いにくい イミュータブル(変更不可) old = [1,2] 元データは そのまま 新しいコピー new = [1,2,3] ✅ 元の値が残る 安全で予測しやすい
イミュータブルのイメージ
ひよこ ひよこ

イミュータブルって何で変えちゃいけないの?

ペンギン先生 ペンギン先生

変えないほうがバグが少ないからだよ。データが変わらないと「どこかで意図せず変えられた」という問題が起きない。特に複数の場所から同じオブジェクトを参照しているとき、一方が変えると他方も影響を受けるバグを防げる。

ひよこ ひよこ

毎回新しいオブジェクトを作るのって重くない?

ペンギン先生 ペンギン先生

素朴に実装すると重くなる。でもImmutable.jsやImmerのようなライブラリは「構造的共有」を使って、変わった部分だけ新しくして残りは共有する。だから実際はそんなに重くなることが多くない。

ひよこ ひよこ

JavaScriptのconstって変えられないんじゃないの?

ペンギン先生 ペンギン先生

constはオブジェクトの「参照」を変えられないだけで、中身は変えられる。「const obj = {a: 1}」としてもobj.a = 2は普通にできる。完全にイミュータブルにしたければObject.freeze()を使うか、イミュータブルを前提にした設計にするしかない。

ひよこ ひよこ

Reactでstateをimmutableにするのはなぜ?

ペンギン先生 ペンギン先生

Reactは前のstateと新しいstateを比較して再レンダリングが必要か判断する。直接stateを書き換えると参照が同じままで変化を検知できず、再レンダリングがスキップされるバグが起きる。スプレッド構文「{...prev, key: value}」で新しいオブジェクトを作ることで参照が変わり、Reactが変化を検知できる。reduxなどの状態管理ライブラリでも同じ原則が核心にある。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
イミュータブルって出てきたら「変更できないデータ・変えたら新しいものを作る」と思えばだいたいOK!
📖 おまけ:英語の意味
「Immutable」 = 変更不可能な
💬 「im(否定)+ mutable(変化できる)」。反対語はミュータブル(mutable・変更可能)
← 用語集にもどる