---
type: errors
language: javascript
slug: is-not-iterable
title: "TypeError: x is not iterable"
title_tag: "TypeError: x is not iterable の原因と直し方"
summary: >
  for...of やスプレッドや分割代入に、回せないものを渡したときに出ます。
  素のオブジェクト、null、通信の結果。原因を多い順に並べ、それぞれ直したコードを載せています。
description: >
  素のオブジェクトは for...of で回せません。null や undefined を渡したとき、通信の結果が
  配列でなかったときの直し方まで、実行しながら確かめられます。
status: published
difficulty: 2
minutes: 8

versions:
  verified: "Node 22.22.3"
  since: "ES2015"
  deprecated: null
  removed: null

sources:
  - title: "GetIterator — ECMAScript® 2026 Language Specification"
    url: "https://tc39.es/ecma262/#sec-getiterator"
  - title: "The for-in, for-of, and for-await-of Statements — ECMAScript® 2026 Language Specification"
    url: "https://tc39.es/ecma262/#sec-for-in-and-for-of-statements"
  - title: "TypeError: 'x' is not iterable — MDN"
    url: "https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Errors/is_not_iterable"

terms: [反復可能, スプレッド, 分割代入]

links:
  related:
    - javascript/reference/iterator/iterable
    - javascript/reference/operator/spread
    - javascript/errors/cannot-read-properties-of-undefined
    - javascript/reference/object/keys

content_updated_at: 2026-09-08
published_at: 2026-09-08
---

**回せないものを、回そうとしたとき**に出ます。

```js bad
for (const value of { a: 1, b: 2 }) {
  console.log(value);
}
```
```output
TypeError: {(intermediate value)(intermediate value)} is not iterable
```

素のオブジェクトは[bad:for...of で回せません]。

[dim:`{(intermediate value)}` は「その場で書いたオブジェクト」という意味です。変数に入れて渡すと、代わりに変数の名前が出ます。]

## どこで出るか

`for...of` だけではありません。**同じ仕組みを使う場所すべて**で出ます。

```js run
const source = { a: 1 };

for (const fn of [
  () => { for (const x of source) console.log(x); },
  () => { const [first] = source; },
  () => { console.log([...source]); },
  () => { new Set(source); },
]) {
  try {
    fn();
  } catch (error) {
    console.log(error.name);
  }
}
```
```output
TypeError
TypeError
TypeError
TypeError
```

| 書き方 | 例 |
|---|---|
| `for...of` | `for (const x of value)` |
| スプレッド | `[...value]` / `f(...value)` |
| **配列の分割代入** | `const [a] = value` |
| `Array.from()` / `new Set()` / `new Map()` | `new Set(value)` |
| `Promise.all()` | `Promise.all(value)` |

**`Symbol.iterator` を持っているかどうか**だけで決まります。
→ [反復可能とイテレータ](/ja/javascript/reference/iterator/iterable/)

## 原因1: 素のオブジェクトを回そうとした

**いちばん多い原因です。**

```js run
const scores = { a: 1, b: 2 };

for (const [key, value] of Object.entries(scores)) {
  console.log(key, value);
}

for (const key of Object.keys(scores)) {
  console.log(key);
}
```
```output
a 1
b 2
a
b
```

| 欲しいもの | 使うもの |
|---|---|
| 鍵だけ | `Object.keys()` |
| 値だけ | `Object.values()` |
| 両方 | `Object.entries()` |

→ [Object.keys() / values() / entries()](/ja/javascript/reference/object/keys/)

[dim:`for...in` でも回せますが、受け継いだ鍵まで拾うので勧めません。]

## 原因2: `null` や `undefined` が来た

```js bad
const list = null;

for (const value of list) {
  console.log(value);
}
```
```output
TypeError: list is not iterable
```

**文言に出るのは、書いた名前であって中身ではありません。**
`list` が `null` なのか、素のオブジェクトなのかは、これだけでは分かりません。

[em:まず中身を出してください。]

```js run
const list = null;

console.log(list, typeof list, Array.isArray(list));
```
```output
null object false
```

`null` や `undefined` だったなら、
[key:回せない形なのではなく、値がまだ入っていない]という意味です。

**出どころをたどってください。** 通信の失敗、まだ届いていない、鍵の綴り違い。

その場で凌ぐなら、空配列に倒します。

```js run
const list = null;

for (const value of list ?? []) {
  console.log(value);
}

console.log('落ちなかった');
```
```output
落ちなかった
```

[bad:ただし、これは原因を隠す書き方でもあります。] 「無いのが正常」なときにだけ使ってください。
→ [Cannot read properties of undefined](/ja/javascript/errors/cannot-read-properties-of-undefined/)

## 原因3: 配列だと思っていたものが違った

通信の結果は、**中に包まれていることがよくあります。**

```js bad
const response = { items: [1, 2], total: 2 };

console.log([...response]);
```
```output
TypeError: response is not iterable
```

`response` ではなく `response.items` が配列です。
**まず中身を出して確かめてください。**

```js run
const response = { items: [1, 2], total: 2 };

console.log(JSON.stringify(response));
console.log([...response.items]);
```
```output
{"items":[1,2],"total":2}
[ 1, 2 ]
```

## 原因4: `length` があるだけの形

```js bad
const fake = { length: 2, 0: 'a', 1: 'b' };

console.log([...fake]);
```
```output
TypeError: fake is not iterable
```

**`length` を持っていても、回せるとは限りません。**
`Array.from()` なら扱えます。

```js run
const fake = { length: 2, 0: 'a', 1: 'b' };

console.log(Array.from(fake));
```
```output
[ 'a', 'b' ]
```

→ [Array.from() / Array.of() / new Array()](/ja/javascript/reference/array/from/)

[dim:ブラウザの `NodeList` や `HTMLCollection` は、いまはどちらでも扱えます。古い環境向けの記事で `Array.prototype.slice.call()` を見かけますが、いま書く必要はありません。]

## 原因5: オブジェクトを分割代入で受けた

```js bad
const point = { x: 1, y: 2 };

const [x, y] = point;
```
```output
TypeError: point is not iterable
```

**角括弧と波括弧を取り違えています。**

```js run
const point = { x: 1, y: 2 };

const { x, y } = point;

console.log(x, y);
```
```output
1 2
```

- `[ ]` … **並び**から順番に取り出す（配列）
- `{ }` … **名前**で取り出す（オブジェクト）

## 自分で回せるようにする

どうしてもそのオブジェクトを回したいなら、`Symbol.iterator` を持たせます。

```js run
const bag = {
  items: [1, 2],
  *[Symbol.iterator]() {
    yield* this.items;
  },
};

console.log([...bag]);
```
```output
[ 1, 2 ]
```

**ただし、ふつうは `Object.entries()` で足ります。**
自作するのは、独自の順序や終わりの条件があるときだけにしてください。

## 探しかたの順序

1. 文言に出ている名前を探す。**それが中身を教えてくれるわけではない**
2. その値を `console.log()` と `typeof` で出す
   - `null` / `undefined` だった → **値の出どころ**を疑う。回し方の問題ではない
   - 素のオブジェクトだった → `Object.entries()` を挟む
   - 中に配列が入っていた → そちらを渡す
3. 分割代入なら、`[ ]` と `{ }` を見直す

[dim:このページの実行結果は Node 22.22.3 のものです。文言は処理系と版によって変わります。自分の環境で出た文言で検索してください。]

## まとめ

- 出るのは `for...of`・スプレッド・**配列の分割代入**・`new Set()` など
- 判定は[key:Symbol.iterator を持つか]だけ
- **素のオブジェクトは回せない。** `Object.entries()` を挟む
- **文言に出るのは書いた名前で、中身ではない。** まず値を出して見る
- 値が `null` / `undefined` だったなら、[em:出どころの問題]
- `length` があるだけの形は `Array.from()` で扱う
- `[ ]` と `{ }` の取り違えでも出る
