JavaScript
🟡 Uncaught TypeError: x.forEach is not a function
forEachできない値に対してforEachしている
😰 こんな症状
forEachを書いた行で「is not a function」と出る。forEachの手前にある値が配列じゃないのが原因だよ。getElementsByClassNameの戻り値やawaitのし忘れでよく起きるよ。
🔍 原因
forEachの手前の値が配列(またはNodeList)になっていないよ。よくあるのは3パターン。(1) getElementsByClassName() / getElementsByTagName() の戻り値はHTMLCollectionで、forEachが使えない(querySelectorAll() のNodeListなら使える)。 (2) fetchの結果に await を付け忘れて、配列ではなくPromiseが入っている。 (3) JSONの中身が配列ではなくオブジェクト({})になっている。Array.isArray(x) で配列かどうか確かめられるよ。
❌ エラーが起きるコード
const items = document.getElementsByClassName("item");
items.forEach(el => console.log(el));
// Uncaught TypeError: items.forEach is not a function
// (HTMLCollection には forEach がない) ✅ 直し方
1. console.log(x) と console.log(Array.isArray(x)) で中身を確認する。 2. HTML要素の一覧なら querySelectorAll() に変えるか、Array.from(collection) で配列に変換する。 3. 非同期の結果なら await を付ける。 4. JSONがオブジェクトなら、配列が入っているプロパティ(例: data.items)を指定する。
✅ 修正後のコード
// 方法1: querySelectorAll を使う(NodeList は forEach OK)
const items = document.querySelectorAll(".item");
items.forEach(el => console.log(el));
// 方法2: Array.from で配列に変換する
Array.from(document.getElementsByClassName("item"))
.forEach(el => console.log(el)); この解決法は役立ちましたか?
🔗 関連するエラー
- TypeError: xxx is not a function — 関数でないものを呼び出している
- Uncaught TypeError: Cannot read properties of undefined (reading 'length') — undefinedに対して.lengthを読んでいる
- Uncaught ReferenceError: xxx is not defined — 変数・関数名のタイポ
- Uncaught TypeError: Cannot read properties of null (reading 'addEventListener') — 取得しようとしたHTML要素が見つかっていない
- TypeError: undefined is not an object (evaluating 'obj.name') — 存在しないオブジェクトのプロパティにアクセスしている
🔗 別カテゴリの関連エラー
📖 この問題を学べるレッスン
📝 関連ブログ記事
- プログラミングのエラーメッセージの読み方 — エラーの読み方を基礎から解説
- JavaScriptとは?初心者向けにわかりやすく解説 — 変数・関数・イベントの基本
- JavaScriptでボタンクリックを動かす方法 — ボタンクリック時の動作を解説