Immutable (不変)
不変 (immutable) とは、まったく新しい値を作成しない限り、その内容を変更することができない値のことです。
JavaScript では、プリミティブ値は不変です。一度プリミティブ値を作成すると、それを保持する変数に別の値を代入することはできますが、変更することはできません。 これに対して、オブジェクトと配列は既定では変更可能な値です。プロパティや要素は新しい値を再代入することなく変更できるからです。
いくつかの理由から、不変オブジェクトを使用すると有益です。
- パフォーマンス向上のため(オブジェクトの将来の変更を計画しないため)
- メモリー使用量を減らすため(オブジェクト全体を複製するのではなくオブジェクト参照 を行うため)
- スレッドセーフにするため(複数のスレッドが互いに干渉することなく同じオブジェクトを参照できるため)
- 開発者の精神的負担を軽減するため(オブジェクトの状態が変化せず、常に挙動が一貫しているため)
なお、変更可能性は簡単に証明できます。オブジェクトは、そのプロパティを変更する方法を 1 つ提供している限り、変更可能です。一方、不変性は、それを保証するための言語意味づけがない場合、証明するのが難しいものです。例えば、Object.freeze()
は JavaScript でオブジェクトを不変にする言語レベルのメソッドです。