JavaScript TypeError: Cannot read properties of undefined の原因と解決方法

TypeError: Cannot read properties of undefined とは

JavaScriptでTypeError: Cannot read properties of undefined (reading ‘xxx’)が発生するのは、undefinedまたはnullの値に対してプロパティアクセスやメソッド呼び出しを行った場合です。JavaScriptで最も頻繁に発生するランタイムエラーの一つであり、フロントエンド開発からNode.jsまで幅広い場面で遭遇します。

このエラーの原因は「undefined/nullにプロパティアクセスしている」の一点です。エラーメッセージの (reading ‘xxx’) の部分がアクセスしようとしたプロパティ名を示しています。



エラーの発生パターン

このエラーは主に以下のようなケースで発生します。

パターン1: ネストされたオブジェクトのプロパティアクセス

const user = {};
console.log(user.address.city);
// TypeError: Cannot read properties of undefined (reading 'city')

user.addressがundefinedのため、さらに.cityにアクセスするとエラーが発生します。

// 修正例1: オプショナルチェーン(ES2020)
console.log(user.address?.city);  // undefined(エラーにならない)

// 修正例2: 論理AND演算子
console.log(user.address && user.address.city);

// 修正例3: デフォルト値の設定
const city = user.address?.city ?? "不明";

パターン2: 配列の範囲外アクセス

const items = [{ name: "A" }];
console.log(items[5].name);
// TypeError: Cannot read properties of undefined (reading 'name')
// 修正例: インデックスの存在確認
if (items[5]) {
    console.log(items[5].name);
}
// または オプショナルチェーン
console.log(items[5]?.name);

パターン3: 非同期処理でのデータ未取得

// React の例
const [user, setUser] = useState();  // 初期値 undefined

// 初回レンダリング時にエラー
return <p>{user.name}</p>;
// TypeError: Cannot read properties of undefined (reading 'name')
// 修正例: 初期値の設定 + オプショナルチェーン
const [user, setUser] = useState(null);
return <p>{user?.name ?? "読み込み中..."}</p>;
React・Vue・Next.jsなどのフレームワークでは、APIからのデータ取得前にレンダリングが走るため、このエラーが頻発します。初期値(null や空オブジェクト)を必ず設定しましょう。

根本原因の特定方法

このエラーをデバッグする際は、ブラウザの開発者ツール(DevTools)のConsoleタブでスタックトレースを確認します。エラーが発生した行で、ドット(.)やブラケット([])の左側の値がundefinedまたはnullになっています。

// デバッグ例
console.log(typeof user);        // "undefined" と表示されたら原因特定
console.log(user);               // undefined
console.log(JSON.stringify(user)); // "undefined"

防止策とベストプラクティス

このエラーを未然に防ぐには、以下のアプローチが有効です。オプショナルチェーン(?.)とNull合体演算子(??)はモダンJavaScriptの必須テクニックです。分割代入でのデフォルト値設定も効果的です。

// 防止策まとめ
// 1. オプショナルチェーン + Null合体演算子
const city = user?.address?.city ?? "デフォルト";

// 2. 分割代入でデフォルト値
const { address = {} } = user || {};
const { city = "不明" } = address;

// 3. Array.isArray() で配列チェック
if (Array.isArray(items) && items.length > 0) {
    console.log(items[0].name);
}

// 4. TypeScriptの厳密なnullチェック
// tsconfig.json: "strictNullChecks": true
オプショナルチェーン(?.)はES2020の機能で、モダンブラウザとNode.js 14以降で使用可能です。TypeScriptとの併用でさらに安全性が高まります。

Stack Overflowでの質問状況

Stack Overflowでは、JavaScriptに関する質問が非常に多く投稿されています。Cannot read properties of undefinedは最も質問数の多いエラーの一つであり、特にReact・Vue・Angular利用者からの質問が多いのが特徴です。

よくある質問(FAQ)

Q
undefinedとnullの違いは何ですか?
A

undefinedは変数が宣言されたが値が代入されていない状態を示します。nullは意図的に「値がない」ことを示すために代入する値です。typeof undefinedは’undefined’、typeof nullは’object’を返します。どちらもプロパティアクセスでTypeErrorが発生します。

Q
オプショナルチェーン(?.)はどのブラウザで使えますか?
A

ES2020で導入されたオプショナルチェーンは、Chrome 80以降、Firefox 72以降、Safari 13.1以降、Edge 80以降で対応しています。IE11では使用できないため、対応が必要な場合はBabelでのトランスパイルが必要です。

Q
React/Vueでこのエラーが出るのはなぜですか?
A

フレームワークでは非同期データ(API取得)を扱うことが多く、データ取得前のレンダリング時にundefinedのプロパティにアクセスしてエラーが発生するケースが典型的です。初期値の設定やローディング状態の管理で防止できます。

免責事項: 当記事の情報は執筆時点の内容に基づいています。最新情報は各公式サイトをご確認ください。当サイトは情報提供を目的としており、資格取得・技術的対応の結果について一切の責任を負いません。




コメント

YouTubeも運営中。チャンネル登録はこちら!!
JavaScript
デプロイ太郎のSNSを見てみる!!
タイトルとURLをコピーしました