カテゴリ: JavaScript 更新日: 2025/09/03

JavaScriptのオブジェクト操作でよくあるエラーとその解決策まとめ|初心者でもわかる対処法

JavaScriptのオブジェクト操作でよくあるエラーとその解決策まとめ
JavaScriptのオブジェクト操作でよくあるエラーとその解決策まとめ

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

生徒

「JavaScriptでオブジェクトを使っていると、よくエラーが出るんですが、どうしてでしょうか?」

先生

「JavaScriptのオブジェクト操作は便利ですが、慣れないとよくあるミスでエラーになることがあります。今日は代表的なエラーとその解決策をわかりやすく説明しますね。」

生徒

「どんなエラーがあるのか、具体的に教えてください!」

先生

「はい、それでは順番に見ていきましょう!」

1. 「undefined」のエラーや値が取れない問題

1. 「undefined」のエラーや値が取れない問題
1. 「undefined」のエラーや値が取れない問題

JavaScriptでオブジェクトのプロパティを取り出そうとしたときに、undefinedが返ってきたり、エラーになったりすることがあります。これは、指定したプロパティが存在しないためです。

例えば、次のようなオブジェクトを考えましょう。


const person = {
  name: "太郎",
  age: 30
};
console.log(person.address); // undefined と表示される

addressプロパティは存在しないので、値はundefinedになります。この状態でさらに深い階層を参照するとエラーになることもあります。

解決策としては、オプショナルチェーン(?.演算子)を使う方法があります。


console.log(person.address?.city); // undefined と表示されエラーにならない

オプショナルチェーンは「もし途中の値がなければそこで止めてundefinedにする」という便利な機能です。

2. 「TypeError: ○○ is not a function」のエラー

2. 「TypeError: ○○ is not a function」のエラー
2. 「TypeError: ○○ is not a function」のエラー

オブジェクトのメソッドを呼び出すときに「○○ is not a function」というエラーが出ることがあります。これは、呼び出そうとしているメソッドが実際には存在しなかったり、関数でない場合に起こります。

例を見てみましょう。


const obj = {
  greet: "こんにちは"
};
obj.greet(); // TypeError: greet is not a function

ここでは、greetは文字列なので関数のように呼べずエラーになります。

解決策は、関数かどうか確認するか、メソッドとして正しく定義することです。


const obj = {
  greet() {
    console.log("こんにちは");
  }
};
obj.greet(); // こんにちは と表示される

3. プロパティの上書きや削除で失敗することがある

3. プロパティの上書きや削除で失敗することがある
3. プロパティの上書きや削除で失敗することがある

オブジェクトのプロパティを変更したり削除したりしようとしても、うまくいかない場合があります。特に、constで宣言したオブジェクト自体を再代入しようとするとエラーになります。


const obj = { a: 1 };
obj = { b: 2 }; // エラーになる(再代入はできない)

ただし、constでもオブジェクトの中身の変更は可能です。


const obj = { a: 1 };
obj.a = 10; // OK
delete obj.a; // OK

また、Object.freeze()という関数でオブジェクトを凍結(変更不可)にしている場合はプロパティの変更や削除ができません。

4. プロパティの存在確認でよくあるミス

4. プロパティの存在確認でよくあるミス
4. プロパティの存在確認でよくあるミス

オブジェクトに特定のプロパティがあるかどうか確認するには、in演算子やhasOwnPropertyメソッドを使いますが、使い方を間違えると誤った結果になることがあります。


// 正しい使い方
if ("name" in person) {
  console.log("nameがあります");
}

// 間違った例(プロトタイプもチェックしてしまう)
if (person.hasOwnProperty("name")) {
  console.log("nameがあります");
}

ここで注意したいのは、hasOwnPropertyはオブジェクト自身のプロパティだけをチェックしますが、継承されたプロパティは見ません。

実際のコードでどちらを使うかは状況によって判断しましょう。

5. JSONのパースでのエラー

5. JSONのパースでのエラー
5. JSONのパースでのエラー

オブジェクト形式のデータを文字列で扱う場合、JSON.parse()で変換しますが、形式が正しくないとエラーが出ます。


const jsonStr = '{"name":"太郎","age":30}';
const obj = JSON.parse(jsonStr); // 正常にオブジェクトになる

const badJsonStr = '{"name":"太郎",age:30}';
const obj2 = JSON.parse(badJsonStr); // SyntaxErrorになる

JSONはキーや文字列を必ずダブルクォーテーション(")で囲む必要があるので注意しましょう。

6. オブジェクトのキーに変な値を使うと意図しない動きに

6. オブジェクトのキーに変な値を使うと意図しない動きに
6. オブジェクトのキーに変な値を使うと意図しない動きに

JavaScriptのオブジェクトのキーは基本的に文字列ですが、他の型を使うと文字列に変換されます。そのため、数字の1と文字列の"1"は同じキーとして扱われます。


const obj = {};
obj[1] = "数字の1";
obj["1"] = "文字列の1";
console.log(obj); // { "1": "文字列の1" }

同じキーとして上書きされるため、意図しない結果になることがあります。キーはなるべく文字列で統一するか、Mapオブジェクトの使用も検討しましょう。

7. 変数名とプロパティ名の混同に注意

7. 変数名とプロパティ名の混同に注意
7. 変数名とプロパティ名の混同に注意

オブジェクトのプロパティ名と変数名を間違えて使うと、値が取得できないことがあります。


const name = "太郎";
const person = { name: "花子" };
console.log(name);      // 太郎
console.log(person.name); // 花子
console.log(person.Name); // undefined(大文字と小文字は区別される)

JavaScriptは大文字・小文字を区別するので、プロパティ名の綴りも正確に書くことが大切です。

8. プロパティの追加や更新の基本と注意点

8. プロパティの追加や更新の基本と注意点
8. プロパティの追加や更新の基本と注意点

オブジェクトに新しいプロパティを追加したり、既存の値を更新するのは簡単ですが、思わぬ影響が出ることもあります。


const obj = { a: 1 };
obj.b = 2;       // プロパティbを追加
obj.a = 10;      // プロパティaの値を変更

このとき、オブジェクトを他の変数に代入している場合、同じオブジェクトを指しているので、どちらを変更しても影響があります。


const obj1 = { a: 1 };
const obj2 = obj1;
obj2.a = 100;
console.log(obj1.a); // 100 と表示される

これは「参照渡し」と呼ばれ、オブジェクトの特性です。もしコピーしたい場合は、Object.assign()やスプレッド構文を使います。

9. エラーを減らすためのポイントまとめ

9. エラーを減らすためのポイントまとめ
9. エラーを減らすためのポイントまとめ
  • オプショナルチェーン(?.)を使い、安全にプロパティを取得する
  • 関数かどうか確認してからメソッドを呼ぶ
  • constで宣言してもオブジェクトの中身は変更可能
  • プロパティの存在確認はin演算子やhasOwnPropertyを使い分ける
  • JSONの形式に注意して正しい文字列を扱う
  • オブジェクトのキーは文字列として扱われることを理解する
  • 大文字・小文字は区別されるので正確に書く
  • オブジェクトのコピーは浅いコピーで十分か考える
関連記事:
カテゴリの一覧へ
新着記事
New1
TypeScript
TypeScriptのモジュール分離と単一責任原則(SRP)に基づく設計を初心者向けに徹底解説
New2
JavaScript
JavaScriptの正規表現を文字列に動的に組み込む方法(RegExpコンストラクタ)
New3
TypeScript
TypeScriptでグローバル名前空間の汚染を避ける設計方法!モジュール設計の基本
New4
JavaScript
JavaScriptの正規表現をデバッグするツールの使い方
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptの正規表現をデバッグするツールの使い方
No.3
Java&Spring記事人気No3
JavaScript
JavaScriptの正規表現で繰り返し指定(* + ? {n,m})を学ぼう
No.4
Java&Spring記事人気No4
JavaScript
JavaScriptの正規表現を使ったバリデーション例まとめ
No.5
Java&Spring記事人気No5
JavaScript
JavaScriptの正規表現で否定のパターンを表す方法を学ぼう
No.6
Java&Spring記事人気No6
JavaScript
JavaScriptプログラムの実行方法まとめ!ブラウザ・Node.js・コンソールの使い方
No.7
Java&Spring記事人気No7
JavaScript
JavaScriptの正規表現でlookahead・lookbehindを使う応用例
No.8
Java&Spring記事人気No8
JavaScript
JavaScriptの正規表現のよくあるエラーとその対処法