From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- .../reference/errors/is_not_iterable/index.html | 105 +++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 files/ja/web/javascript/reference/errors/is_not_iterable/index.html (limited to 'files/ja/web/javascript/reference/errors/is_not_iterable') diff --git a/files/ja/web/javascript/reference/errors/is_not_iterable/index.html b/files/ja/web/javascript/reference/errors/is_not_iterable/index.html new file mode 100644 index 0000000000..6da6ca9b19 --- /dev/null +++ b/files/ja/web/javascript/reference/errors/is_not_iterable/index.html @@ -0,0 +1,105 @@ +--- +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")}}
+ +

メッセージ

+ +
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 の右側や {{jsxref("Promise.all")}} や {{jsxref("TypedArray.from")}} のような関数の引数として与えられた値が 反復可能オブジェクト ではありません。反復可能なものは、{{jsxref("Array")}} や {{jsxref("String")}}、{{jsxref("Map")}}、ジェネレーターの結果のようなビルトイン反復可能型や 反復処理プロトコル を実装したオブジェクトです。

+ +

+ +

オブジェクトのプロパティを反復処理する

+ +

JavaScript では、反復処理プロトコル を実装していない限り {{jsxref("Object")}} は反復処理できません。それゆえ、オブジェクトのプロパティを反復処理するために for…of を使用することはできません。

+ +
var obj = { 'France': 'Paris', 'England': 'London' };
+for (let p of obj) { // TypeError: obj is not iterable
+    // …
+}
+
+ +

代わりに、オブジェクトのプロパティを反復処理するためには {{jsxref("Object.keys")}} か {{jsxref("Object.entries")}} を使用してください。

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

このユースケースのそのほかの選択肢として、{{jsxref("Map")}} を使用することもできます:

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

ジェネレーターを呼び出していないとき、ジェネレーターに対応した {{jsxref("Function")}} オブジェクトは呼び出し可能ですが、反復処理はできません。ジェネレーターを呼び出すと、ジェネレーターの実行中に生成された値を反復処理する反復可能オブジェクトが生成されます。

+ +
function* generate(a, b) {
+    yield a;
+    yield b;
+}
+
+for (let x of generate(1,2))
+    console.log(x);
+
+ +

関連項目

+ + -- cgit v1.2.3-54-g00ecf