カテゴリ: JavaScript 更新日: 2025/08/29

JavaScriptのオブジェクトのイミュータブル化(Object.freeze)とは?初心者でもわかるやさしい解説

JavaScriptのオブジェクトのイミュータブル化(Object.freeze)とは?
JavaScriptのオブジェクトのイミュータブル化(Object.freeze)とは?

先生と生徒の会話形式で理解しよう

生徒

「JavaScriptでオブジェクトを『イミュータブル』にするってどういう意味ですか?」

先生

「イミュータブルとは『変更できない』という意味です。JavaScriptではObject.freeze()という機能を使って、オブジェクトを変更できないようにすることができますよ。」

生徒

「変更できないって、具体的にはどういうことですか?」

先生

「例えば、大事な設定情報が間違って変わらないように守るイメージです。さっそく詳しく説明していきますね!」

1. イミュータブルとは?オブジェクトの変更禁止の意味

1. イミュータブルとは?オブジェクトの変更禁止の意味
1. イミュータブルとは?オブジェクトの変更禁止の意味

イミュータブル(immutable)は「変わらない」「変更できない」という意味です。JavaScriptのオブジェクトは通常、プロパティ(値)を自由に変えられます。

しかしObject.freeze()を使うと、そのオブジェクトの中身を変更できなくなります。変更しようとするとエラーにはなりませんが、変更は無視されます。

これにより、データが勝手に変わってしまうミスを防ぐことができます。

2. Object.freeze()の使い方

2. Object.freeze()の使い方
2. Object.freeze()の使い方

Object.freeze()は引数にオブジェクトを渡すだけで、そのオブジェクトを凍らせて変更禁止にします。


const person = {
  name: "太郎",
  age: 30
};

Object.freeze(person);

person.age = 40;   // 変更されない
person.city = "東京"; // 新しいプロパティも追加できない

console.log(person.age);  // 30
console.log(person.city); // undefined

このように、一度凍らせたオブジェクトは中身を書き換えたり、プロパティを追加できなくなります。

3. なぜオブジェクトをイミュータブルにするの?

3. なぜオブジェクトをイミュータブルにするの?
3. なぜオブジェクトをイミュータブルにするの?

プログラムが大きくなると、色んな場所から同じオブジェクトを触ることがあります。そんなときに、勝手に内容が変わるとバグの原因になります。

イミュータブルにすると「これは絶対変わらないデータだ」と決められるので、安心して使えます。

特にReactなどのライブラリでは、イミュータブルデータを扱うことが多いです。

4. 注意点:Object.freeze()は浅い凍結(しゃくてい)

4. 注意点:Object.freeze()は浅い凍結(しゃくてい)
4. 注意点:Object.freeze()は浅い凍結(しゃくてい)

Object.freeze()は、オブジェクトの一番外側だけを凍らせます。もしオブジェクトの中に別のオブジェクトがある場合、その中のプロパティは凍りません。

これを「浅い凍結」と呼びます。


const user = {
  name: "花子",
  address: {
    city: "大阪",
    zip: "123-4567"
  }
};

Object.freeze(user);

user.address.city = "京都"; // 変更できてしまう
console.log(user.address.city); // 京都

このように、ネストされたオブジェクトの中身は変わってしまうので、深く凍結したい場合は再帰的に処理する必要があります。

5. 深い凍結(ディープフリーズ)を自分で作る方法

5. 深い凍結(ディープフリーズ)を自分で作る方法
5. 深い凍結(ディープフリーズ)を自分で作る方法

深い凍結とは、オブジェクトの中にある全てのオブジェクトを再帰的に凍結することです。以下は簡単な例です。


function deepFreeze(obj) {
  Object.freeze(obj);

  Object.keys(obj).forEach(key => {
    if (
      obj[key] !== null &&
      typeof obj[key] === "object" &&
      !Object.isFrozen(obj[key])
    ) {
      deepFreeze(obj[key]);
    }
  });

  return obj;
}

const user = {
  name: "花子",
  address: {
    city: "大阪",
    zip: "123-4567"
  }
};

deepFreeze(user);

user.address.city = "京都"; // 変更できない
console.log(user.address.city); // 大阪

これでオブジェクトの中の中まで変更できなくなります。

6. まとめ:イミュータブル化のポイント

6. まとめ:イミュータブル化のポイント
6. まとめ:イミュータブル化のポイント
  • Object.freeze()でオブジェクトを変更不可にできる。
  • 変更しようとしても無視され、バグ防止に役立つ。
  • 浅い凍結なのでネストされたオブジェクトは注意が必要。
  • 深い凍結は自作の関数などで対応できる。

JavaScriptのイミュータブル化は、安全でバグを減らすためにとても役立つ基本テクニックです。ぜひ覚えて使ってみてくださいね。

関連記事:
カテゴリの一覧へ
新着記事
New1
TypeScript
TypeScript × ES6の連携まとめ!安全でモダンなJavaScript開発の鍵
New2
TypeScript
TypeScriptの型システムとは?静的型付けのメリットと基本
New3
JavaScript
JavaScriptの正規表現で繰り返し指定(* + ? {n,m})を学ぼう
New4
TypeScript
TypeScriptとESNextの連携を完全ガイド!最新機能を使いこなす設定と対応法
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptの日時操作Tips!実務で役立つテクニック集
No.3
Java&Spring記事人気No3
TypeScript
TypeScriptでESLintとPrettierを導入!コード整形ルールを自動で統一する方法
No.4
Java&Spring記事人気No4
JavaScript
JavaScriptプログラムの実行方法まとめ!ブラウザ・Node.js・コンソールの使い方
No.5
Java&Spring記事人気No5
TypeScript
TypeScriptでコメントを書く正しい書き方と使い分け【初心者向けにやさしく解説】
No.6
Java&Spring記事人気No6
JavaScript
JavaScriptの正規表現で文字列を置換する方法(replaceメソッド)
No.7
Java&Spring記事人気No7
TypeScript
TypeScriptのif文の使い方を完全ガイド!初心者でもわかる条件分岐
No.8
Java&Spring記事人気No8
TypeScript
TypeScriptで非同期イテレーター(for await of)を活用する