undefinedのプロパティ読み取りエラーの原因
undefinedになった値のプロパティやメソッドにアクセスしようとしたときに出る、JavaScript学習者が最も多く遭遇するエラーです。値が本当にundefinedになる典型的な場面を整理します。
エラーメッセージの読み方
main.js:2
main.js- ファイル名
2- 行番号 — 実際にクラッシュした行
TypeError- 例外クラス — 何が起きたか。ここを検索するのが最短です
Cannot read properties of undefined (reading 'length')- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 let s = undefined; ^ 2 console.log(s.length);
sがundefinedのままlengthにアクセスしています。undefinedは「値が存在しない」ことを表すため、プロパティを持ちません。
直し方: undefined を "hi" にします。
パターン2
1 let user = undefined ; ^ 2 console.log(user.name);
userがundefinedのままnameを読もうとしています。オブジェクトを代入し忘れると、後続のプロパティアクセスで必ずここに行き着きます。
直し方: undefined を { name: "Al" } にします。
パターン3
1 function getConfig() { 2 ^ 3 } 4 const config = getConfig(); 5 console.log(config.port);
return文がない関数は暗黙にundefinedを返します。呼び出し側は戻り値を確認せずプロパティへアクセスするとここで止まります。
直し方: (空) を return { port: 8080 }; にします。
パターン4
1 let profile; 2 function loadProfile() { 3 ^ 4 } 5 profile = loadProfile(); 6 console.log(profile.email);
return文がない関数は暗黙にundefinedを返します。呼び出し側がプロパティへアクセスするとここで止まります。
直し方: (空) を return { email: "a@b.com" }; にします。
パターン5
1 const users = [{ name: "Al" }]; 2 console.log(users[1 ].name); ^
要素が1つしかない配列で添字1を指定すると、その要素はundefinedです。undefinedのプロパティを読もうとしてエラーになります。
直し方: 1 を 0 にします。
よくある誤解
「変数を宣言したから何か値が入っている」とは限りません。宣言だけでは中身はundefinedのままで、関数が値を返し忘れたり、プロパティが存在しなかったりすると、そのままundefinedが伝播します。
実務での勘所
JavaScriptには「値が無い」を表す状態がundefinedとnullの2種類あり、混同されがちですが役割が違います。undefinedは、変数を宣言しただけで代入していない、関数がreturnを書かずに終わった、オブジェクトに存在しないプロパティを読んだ、といった「言語やエンジンが自動的に補う空の値」です。nullは逆に、開発者が「意図的に何も無い」と示すために自分で代入する値です。このエラーがnullではなくundefinedを名指ししているのは、ほとんどの場合が意図的な代入ではなく、値を返し忘れた・存在しないプロパティを読んだといった見落としから来ているためです。
関連するエラー
- ReferenceError: x is not defined の原因と直し方存在しない変数・関数名を参照したときに出るエラーです。
- 配列の範囲外アクセスがエラーにならずundefinedになるJavaScriptの配列は範囲外の添字にアクセスしてもエラーを投げません。
- typeof null === 'object' の罠typeof演算子はnullに対して"object"を返します。