TypeError: Cannot read properties of undefined (reading 'x')

undefined のプロパティを読もうとしたときに出ます。原因を多い順に並べ、それぞれ直したコードを載せています。スタックトレースのどこを見るかも書いています。

実行して検証済み処理系Node 22.22.3難易度●●○○○目安9更新

undefinedプロパティを読もうとしたときに出ます。 x の部分には、読もうとしたプロパティ名が入ります。

javascript
const user = undefined;

console.log(user.name);
TypeError: Cannot read properties of undefined (reading 'name')
text
TypeError: Cannot read properties of undefined (reading 'name')
at showName (file:///app/example.mjs:7:15)
at file:///app/example.mjs:10:13
at ModuleJob.run (node:internal/modules/esm/module_job:343:25)
at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26)

user.name が undefined なのではありません。user そのものが undefined です。 ここを取り違えると、直す場所を間違えます。

まずスタックトレースを見る

javascript
const users = [{ id: 1, name: 'あかり' }];

const user = users.find(u => u.id === 2);

console.log(user.name);
TypeError: Cannot read properties of undefined (reading 'name')

見るのは上から2行目、つまり at で始まる最初の行です。 example.mjs715文字目で起きた、と書いてあります。

見るか 何が書いてあるか
1行目 見る どのプロパティを読もうとしたか(reading 'name'
2行目 いちばん見る 自分のコードのどこで起きたか
3行目以降 見る そこを呼んだのは誰か(呼び出しの道すじ)
node:internal/ を含む行 無視してよい 処理系の内部。原因はここにない

node_modules/node:internal/ しか出ていないときは、 その1つ下の自分のコードの行まで下がって探します。

原因1: 探したものが見つからなかった(いちばん多い)

find()見つからないと undefined を返します。例外は投げません。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
該当する利用者がいません
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
undefined (未登録)

id: 2 の人はいないので userundefined です。

直しかた

見つからなかったときにどうするかを、その場で決めます。

javascript
const res = { data: {} };

console.log(res.data.user.name);
TypeError: Cannot read properties of undefined (reading 'name')
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
(なし)

「あるなら読む、無いなら undefined でよい」ならオプショナルチェーンが短く書けます。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
{ data: {} } {} undefined
javascript
function makeUser(name) {
const user = { name };
}

const user = makeUser('あかり');

console.log(user.name);
TypeError: Cannot read properties of undefined (reading 'name')

?.左が null か undefined なら、そこで止まって undefined を返します何でも ?. を付ければよいわけではありません。 「無いことが正常」な場所にだけ使ってください。本来あるはずのものが無いなら、それは不具合です。

原因2: 途中の階層が無い

深いところを一気に辿ると、どこで切れたか分からなくなります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
あかり
javascript
async function fetchUser() {
return { profile: { name: 'あかり' } };
}

const user = fetchUser();

console.log(user.profile.name);
TypeError: Cannot read properties of undefined (reading 'name')

res.data はあります。無いのは res.data.user です。 エラー文の reading 'name'読もうとしたものなので、 その1つ手前が undefined だと分かります。

直しかた

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
あかり
javascript
const el = null;

console.log(el.value);
TypeError: Cannot read properties of null (reading 'value')

どこで切れたかを調べたいときは、手前から順に出します。

javascript
const user = { name: 'あかり' };

console.log(user.getName());
TypeError: user.getName is not a function

原因3: 関数が何も返していない

return を書き忘れると、その関数は undefined を返します。エラーにはなりません

直しかた

アロー関数で {} を書いたときも同じです。n => { n * 2 }undefined を返します。

原因4: 待つ前に触った

await を書き忘れると、まだ結果ではなく Promise が入っています。 Promisename は無いので undefined になり、その先で落ちます。

userPromise です。user.profileundefined になり、その .name で落ちます。

直しかた

このページの実行環境では、コードの一番外側でも await が書けます。

似ているエラーとの違い

null のとき

null だと文言が変わります別の原因なので読み分けてください。

null は「無いことが分かっている」印です。ブラウザで document.querySelector() が見つけられなかったときは null が返ります。

文言 中身 典型的な原因
... of undefined まだ入っていない / 返ってこなかった find() が空振り、return 忘れ、await 忘れ
... of null 無いと分かっている querySelector() が見つけられなかった

関数ではないとき

プロパティは読めたが、それが関数ではなかった場合は別のエラーです。

こちらは TypeError: x is not a function にまとめてあります。

処理系によって文言が違う

同じ原因でも、書いてある文が違います。検索するときは自分の環境の文言で調べてください。

処理系 文言
Node / Chrome(V8) Cannot read properties of undefined (reading 'name')
Chrome(古い版) Cannot read property 'name' of undefined
Firefox(SpiderMonkey) user is undefined
Safari(JavaScriptCore) undefined is not an object (evaluating 'user.name')

このページの実行結果は Node 22.22.3 のものです。

起きにくくするには

  • 見つからないことがある関数を覚える。 find() / at() / pop() / Map.get() / querySelector() は、空振りすると undefinednull を返します
  • 一気に辿らない。 a.b.c.d と書く前に、a.b が何かを確かめる
  • ?. を保険として撒かない。 無いことが正常な場所にだけ使う。 そうしないと不具合が静かに先へ進みます

配列から目的の要素を取り出すときの find()filter() の違いは filter() にまとめてあります。

この記事の根拠

  1. GetV — ECMAScript® 2026 Language Specificationtc39.es
  2. Optional chaining (?.) — MDNdeveloper.mozilla.org
  3. TypeError: can't access property "x" of undefined — MDNdeveloper.mozilla.org

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)