From 816ac814e8a11897db45dfad83cfdd9d3dae55fb Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO JavaScript の例外 "is not iterable" は、 for…of の右辺として与えられた値や、 {{jsxref("Promise.all")}} または {{jsxref("TypedArray.from")}} のような関数の引数として与えられた値が反復可能オブジェクトではなかった場合に発生します。 {{jsxref("TypeError")}} for…of の右辺、 {{jsxref("Promise.all")}} や {{jsxref("TypedArray.from")}} などの引数として指定された値が反復可能オブジェクトではありません。反復可能なものは、 {{jsxref("Array")}}, {{jsxref("String")}}, {{jsxref("Map")}} 等のような組み込み反復可能型や、ジェネレーターの結果、反復可能プロトコルを実装しているオブジェクトが成ることができます。 JavaScript では、 {{jsxref("Object")}} は反復処理プロトコル を実装していない限り反復処理できません。したがって、オブジェクトのプロパティを反復処理するために for…of を使用することはできません。 代わりに、オブジェクトのプロパティを反復処理するためには {{jsxref("Object.keys")}} か {{jsxref("Object.entries")}} を使用してください。 この使用例のそのほかの選択肢として、{{jsxref("Map")}} を使用することもできます。 ジェネレーター 反復可能オブジェクトを生成するために呼び出す関数です。 ジェネレーターを呼び出していないとき、ジェネレーターに対応した {{jsxref("Function")}} オブジェクトは呼び出し可能ですが、反復処理はできません。ジェネレーターを呼び出すと、ジェネレーターの実行中に生成された値を反復処理する反復可能オブジェクトが生成されます。 独自の反復可能オブジェクトは、 {{jsxref("Symbol.iterator")}} メソッドを実装することで作成することができます。 iterator メソッドはイテレーターであるオブジェクト、すなわち next メソッドを持っている必要があります。
- こちらは正しい実装です。エラーメッセージ
-
-TypeError: 'x' is not iterable (Firefox, Chrome)
-TypeError: 'x' is not a function or its return value is not iterable (Chrome)
-
-
-エラータイプ
-
-何がうまくいかなかったのか?
-
-例
-
-オブジェクトのプロパティの反復処理
-
-var obj = { 'France': 'Paris', 'England': 'London' };
-for (let p of obj) { // TypeError: obj is not iterable
- // …
-}
-
-
-var obj = { 'France': 'Paris', 'England': 'London' };
-// Iterate over the property names:
-for (let country of Object.keys(obj)) {
- var capital = obj[country];
- console.log(country, capital);
-}
-
-for (const [country, capital] of Object.entries(obj))
- console.log(country, capital);
-
-
-
-var map = new Map;
-map.set('France', 'Paris');
-map.set('England', 'London');
-// Iterate over the property names:
-for (let country of map.keys()) {
- let capital = map[country];
- console.log(country, capital);
-}
-
-for (let capital of map.values())
- console.log(capital);
-
-for (const [country, capital] of map.entries())
- console.log(country, capital);
-
-
-ジェネレーターを反復処理する
-
-function* generate(a, b) {
- yield a;
- yield b;
-}
-
-for (let x of generate) // TypeError: generate is not iterable
- console.log(x);
-
-
-function* generate(a, b) {
- yield a;
- yield b;
-}
-
-for (let x of generate(1,2))
- console.log(x);
-
-
-独自の反復可能オブジェクトでの反復処理
-
-const myEmptyIterable = {
- [Symbol.iterator]() {
- return [] // [] は反復可能ですが、イテレーターではありません。 -- next メソッドがないからです。
- }
-}
-
-Array.from(myEmptyIterable); // TypeError: myEmptyIterable is not iterable
-
-
-const myEmptyIterable = {
- [Symbol.iterator]() {
- return [][Symbol.iterator]()
- }
-}
-
-Array.from(myEmptyIterable); // []
-
-
-関連情報
-
-
diff --git a/files/ja/web/javascript/reference/errors/is_not_iterable/index.md b/files/ja/web/javascript/reference/errors/is_not_iterable/index.md
new file mode 100644
index 0000000000..3b3ffb43aa
--- /dev/null
+++ b/files/ja/web/javascript/reference/errors/is_not_iterable/index.md
@@ -0,0 +1,136 @@
+---
+title: 'TypeError: ''x'' is not iterable'
+slug: Web/JavaScript/Reference/Errors/is_not_iterable
+tags:
+ - Error
+ - JavaScript
+ - Reference
+ - TypeError
+translation_of: Web/JavaScript/Reference/Errors/is_not_iterable
+---
+{{jsSidebar("Errors")}}
+
+JavaScript の例外 "is not iterable" は、 [for…of](/ja/docs/Web/JavaScript/Guide/Loops_and_iteration#for...of_statement) の右辺として与えられた値や、 {{jsxref("Promise.all")}} または {{jsxref("TypedArray.from")}} のような関数の引数として与えられた値が[反復可能オブジェクト](/ja/docs/Web/JavaScript/Reference/Iteration_protocols)ではなかった場合に発生します。
+
+## エラーメッセージ
+
+```js
+TypeError: 'x' is not iterable (Firefox, Chrome)
+TypeError: 'x' is not a function or its return value is not iterable (Chrome)
+```
+
+## エラー種別
+
+{{jsxref("TypeError")}}
+
+## エラーの原因
+
+[for…of](/ja/docs/Web/JavaScript/Guide/Loops_and_iteration#for...of_statement) の右辺、 {{jsxref("Promise.all")}} や {{jsxref("TypedArray.from")}} などの引数として指定された値が[反復可能オブジェクト](/ja/docs/Web/JavaScript/Reference/Iteration_protocols)ではありません。反復可能なものは、{{jsxref("Array")}}、{{jsxref("String")}}、{{jsxref("Map")}} 等のような組み込み反復可能型や、ジェネレーターの結果、[反復可能プロトコル](/ja/docs/Web/JavaScript/Reference/Iteration_protocols#the_iterable_protocol)を実装しているオブジェクトが成ることができます。
JavaScript の例外 "is not a non-null object" は、オブジェクトが何かを求めているのに提供されなかった場合に発生します。 {{jsxref("null")}} はオブジェクトではなく、動作しません。
- -TypeError: Invalid descriptor for property {x} (Edge) -TypeError: "x" is not a non-null object (Firefox) -TypeError: Property description must be an object: "x" (Chrome) -TypeError: Invalid value used in weak set (Chrome) -- -
{{jsxref("TypeError")}}
- -どこかでオブジェクトが期待されていますが、提供されませんでした。 {{jsxref("null")}} はオブジェクトではなく、動作しません。与えられた状況で適切なオブジェクトを提供しなければなりません。
- -{{jsxref("Object.create()")}} メソッドや {{jsxref("Object.defineProperty()")}} メソッド、{{jsxref("Object.defineProperties()")}} メソッドを使用するとき、省略可能なディスクリプター引数として、プロパティディスクリプターオブジェクトが想定されます。 (ただの数値のように) オブジェクトを提供しないと、エラーが発生します。
- -Object.defineProperty({}, 'key', 1); -// TypeError: 1 is not a non-null object - -Object.defineProperty({}, 'key', null); -// TypeError: null is not a non-null object -- -
有効なプロパティディスクリプターはこのようになります。
- -Object.defineProperty({}, 'key', { value: 'foo', writable: false }); -- -
WeakMap
オブジェクトと WeakSet
オブジェクトはオブジェクトキーが必要{{jsxref("WeakMap")}} オブジェクトと {{jsxref("WeakSet")}} オブジェクトはオブジェクトキーを保持します。そのほかの型をキーとして使用できません。
- -var ws = new WeakSet(); -ws.add('foo'); -// TypeError: "foo" is not a non-null object- -
代わりにオブジェクトを使用してください。
- -ws.add({foo: 'bar'}); -ws.add(window); -- -
JavaScript の例外 "is not a constructor" は、オブジェクトや変数をコンストラクターとして使用しようとしたものの、そのオブジェクトや変数がコンストラクターではなかった場合に発生します。
- -TypeError: Object doesn't support this action (Edge) -TypeError: "x" is not a constructor - -TypeError: Math is not a constructor -TypeError: JSON is not a constructor -TypeError: Symbol is not a constructor -TypeError: Reflect is not a constructor -TypeError: Intl is not a constructor -TypeError: Atomics is not a constructor -- -
{{jsxref("TypeError")}}
- -オブジェクト、または変数をコンストラクターとして使おうとしていますが、それらがコンストラクターではありません。コンストラクターとは何かについては、コンストラクターまたは new
演算子を参照してください。
{{jsxref("String")}} や {{jsxref("Array")}} のような、new
を使用して生成できる数多くのグローバルオブジェクトがあります。しかし、いくつかのグローバルオブジェクトはそうではなく、 それらのプロパティやメソッドは静的です。次の JavaScript 標準組み込みオブジェクトのうち、 {{jsxref("Math")}}、{{jsxref("JSON")}}、{{jsxref("Symbol")}}、{{jsxref("Reflect")}}、{{jsxref("Intl")}}、{{jsxref("Atomics")}} はコンストラクターではありません:。
function* も、コンストラクターとして使用することはできません。
- -var Car = 1; -new Car(); -// TypeError: Car is not a constructor - -new Math(); -// TypeError: Math is not a constructor - -new Symbol(); -// TypeError: Symbol is not a constructor - -function* f() {}; -var obj = new f; -// TypeError: f is not a constructor -- -
自動車のためのオブジェクト型を作成するとします。このオブジェクト型を Car
と呼び、 make, model, year の各プロパティを持つようにしたいとします。これを実現するには、次のような関数を定義します。
function Car(make, model, year) { - this.make = make; - this.model = model; - this.year = year; -} -- -
次のようにして mycar
というオブジェクトを生成できるようになりました。
var mycar = new Car('Eagle', 'Talon TSi', 1993);- -
直ちに解決するか拒否されるプロミスを返す場合は、 new Promise(...) を生成して操作する必要はありません。
- -これは正しくなく (Promise コンストラクターが正しく呼び出されません)、 TypeError: this is not a constructor
例外が発生します。
return new Promise.resolve(true); -- -
Instead, use the Promise.resolve() or Promise.reject() static methods:
- -// This is legal, but unnecessarily long: -return new Promise((resolve, reject) => { resolve(true); }) - -// Instead, return the static method: -return Promise.resolve(true); -return Promise.reject(false); -- -
// This is legal, but unnecessarily long: +return new Promise((resolve, reject) => { resolve(true); }) + +// Instead, return the static method: +return Promise.resolve(true); +return Promise.reject(false); ++ +
The JavaScript strict - mode-only exception "is read-only" occurs when a global variable or object - property that was assigned to is a read-only property.
- -TypeError: Assignment to read-only properties is not allowed in strict mode (Edge) -TypeError: "x" is read-only (Firefox) -TypeError: 0 is read-only (Firefox) -TypeError: Cannot assign to read only property 'x' of #<Object> (Chrome) -TypeError: Cannot assign to read only property '0' of [object Array] (Chrome) -- -
{{jsxref("TypeError")}}
- -値を割り当てようとしたグローバル変数、またはオブジェクトのプロパティが読み取り専用プロパティです。 (技術的には、 non-writable データプロパティ です。)
- -このエラーは、strict モードコード のときにだけ発生します。strict コードではない場合、割り当ては無視されるだけです。
- -読み取り専用プロパティはさほど一般的ではありませんが、 {{jsxref("Object.defineProperty()")}}、または {{jsxref("Object.freeze()")}} を使用して生成できます。
- -'use strict'; -var obj = Object.freeze({name: 'Elsa', score: 157}); -obj.score = 0; // TypeError - -'use strict'; -Object.defineProperty(this, 'LUNG_COUNT', {value: 2, writable: false}); -LUNG_COUNT = 3; // TypeError - -'use strict'; -var frozenArray = Object.freeze([0, 1, 2]); -frozenArray[0]++; // TypeError -- -
JavaScript の組み込みにも、いくつか読み取り専用プロパティがあります。 Math の定数を再定義しようとしたとします。
- -'use strict'; -Math.PI = 4; // TypeError -- -
残念ながらできません。
- -グローバル変数の undefined
も読み取り専用のため、このようにすると悪名高い "undefined is not a function" エラーが発生します。
'use strict'; -undefined = function() {}; // TypeError: "undefined" is read-only -- -
'use strict'; -var obj = Object.freeze({name: 'Score', points: 157}); -obj = {name: obj.name, points: 0}; // 新しいオブジェクトで置き換える - -'use strict'; -var LUNG_COUNT = 2; // `var` が使われているので、読み取り専用ではない -LUNG_COUNT = 3; // ok (解剖学的にはおかしいけれども) -- -