Code Fix

初級

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);
main.js:2 console.log(s.length); ^ TypeError: Cannot read properties of undefined (reading 'length')

sがundefinedのままlengthにアクセスしています。undefinedは「値が存在しない」ことを表すため、プロパティを持ちません。

直し方: undefined を "hi" にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  let user = undefined     ;
                      ^
 2  console.log(user.name);
main.js:2 console.log(user.name); ^ TypeError: Cannot read properties of undefined (reading 'name')

userがundefinedのままnameを読もうとしています。オブジェクトを代入し忘れると、後続のプロパティアクセスで必ずここに行き着きます。

直し方: undefined を { name: "Al" } にします。

この問題を解いてみる →

パターン3

 1  function getConfig() {
 2                          
                 ^
 3  }
 4  const config = getConfig();
 5  console.log(config.port);
main.js:5 console.log(config.port); ^ TypeError: Cannot read properties of undefined (reading 'port')

return文がない関数は暗黙にundefinedを返します。呼び出し側は戻り値を確認せずプロパティへアクセスするとここで止まります。

直し方: (空) を return { port: 8080 }; にします。

この問題を解いてみる →

パターン4

 1  let profile;
 2  function loadProfile() {
 3                                
                    ^
 4  }
 5  profile = loadProfile();
 6  console.log(profile.email);
main.js:6 console.log(profile.email); ^ TypeError: Cannot read properties of undefined (reading 'email')

return文がない関数は暗黙にundefinedを返します。呼び出し側がプロパティへアクセスするとここで止まります。

直し方: (空) を return { email: "a@b.com" }; にします。

この問題を解いてみる →

パターン5

 1  const users = [{ name: "Al" }];
 2  console.log(users[1 ].name);
                       ^
main.js:2 console.log(users[1].name); ^ TypeError: Cannot read properties of undefined (reading 'name')

要素が1つしかない配列で添字1を指定すると、その要素はundefinedです。undefinedのプロパティを読もうとしてエラーになります。

直し方: 1 を 0 にします。

この問題を解いてみる →

よくある誤解

「変数を宣言したから何か値が入っている」とは限りません。宣言だけでは中身はundefinedのままで、関数が値を返し忘れたり、プロパティが存在しなかったりすると、そのままundefinedが伝播します。

実務での勘所

JavaScriptには「値が無い」を表す状態がundefinedとnullの2種類あり、混同されがちですが役割が違います。undefinedは、変数を宣言しただけで代入していない、関数がreturnを書かずに終わった、オブジェクトに存在しないプロパティを読んだ、といった「言語やエンジンが自動的に補う空の値」です。nullは逆に、開発者が「意図的に何も無い」と示すために自分で代入する値です。このエラーがnullではなくundefinedを名指ししているのは、ほとんどの場合が意図的な代入ではなく、値を返し忘れた・存在しないプロパティを読んだといった見落としから来ているためです。

演習をはじめる

関連するエラー

他の言語ではどうなるか

広告
広告スロット(未設定)