← エラー辞典に戻る

JavaScript

Uncaught TypeError: x.forEach is not a function

forEachできない値に対してforEachしている

こんな症状

forEachを書いた行で「is not a function」と出る。forEachの手前にある値が配列じゃないのが原因だよ。getElementsByClassNameの戻り値やawaitのし忘れでよく起きるよ。

まず試す

console.log(Array.isArray(x)) で配列か確認。HTML要素の一覧なら querySelectorAll に変えるか Array.from で配列にする。

js
// querySelectorAll の戻り値(NodeList)は forEach OK
const items = document.querySelectorAll('.item');
items.forEach(el => console.log(el));

これで直らなければ、下の「自分のケース」を確認。

🔍 自分のケースはどれ?

  • getElementsByClassName / getElementsByTagName を使った
    → 戻り値の HTMLCollection は forEach 不可。querySelectorAll に変えるか Array.from(collection) で配列化する。
  • fetch の結果に forEach した
    → await を付け忘れて Promise が入っている。await を付ける。
  • JSON の中身がオブジェクトだった
    → 配列が入っているプロパティ(例: data.items)を指定する。Array.isArray で確認できる。

なぜ起きる?

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: 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));

✅ 直ったか確認

console.log(x) が配列/NodeList を表示し、forEach がエラーなく各要素を処理すればOK。

🆘 まだ直らないときは

x が undefined の場合は、その値をどこで受け取るはずだったかをさかのぼって確認しよう。

Q&Aで質問する →

この解決法は役立ちましたか?

🔗 関連するエラー

🔗 別カテゴリの関連エラー

📖 この問題を学べるレッスン

JSレッスン4:繰り返し処理で根本から理解する →

✏️ 手を動かして練習

練習ドリル一覧で実際に書いて確認する →

📝 関連ブログ記事

📖 関連する用語

🚀 JSレッスン4:繰り返し処理で根本解決しよう!

このエラーの背景にある仕組みを、手を動かしながら学べるレッスンがあります。完全無料・登録不要。

JSレッスン4:繰り返し処理へ →

❓ 関連するQ&A