イテラブルはイテレーターと同じですか、それとも異なりますか?
と思われる仕様から、反復可能なオブジェクトである、と言う、obj
そのように、obj[Symbol.iterator]
呼び出されたときに、あるオブジェクトを返すように、機能を指しnext
返すことができます方法{value: ___, done: ___}
:オブジェクトを
function foo() {
let i = 0;
const wah = {
next: function() {
if (i <= 2) return { value: (1 + 2 * i++), done: false }
else return { value: undefined, done: true }
}
};
return wah; // wah is iterator
}
let bar = {} // bar is iterable
bar[Symbol.iterator] = foo;
console.log([...bar]); // [1, 3, 5]
for (a of bar) console.log(a); // 1 3 5 (in three lines)
したがって、上記のコードでbar
は、は反復可能でありwah
、反復子であり、next()
は反復子インターフェースです。
したがって、イテラブルとイテレータは別物です。
ただし、ジェネレータとイテレータの一般的な例では次のようになります。
function* gen1() {
yield 1;
yield 3;
yield 5;
}
const iter1 = gen1();
console.log([...iter1]); // [1, 3, 5]
for (a of iter1) console.log(a); // nothing
const iter2 = gen1();
for (a of iter2) console.log(a); // 1 3 5 (in three lines)
console.log(iter1[Symbol.iterator]() === iter1); // true
上記の場合、gen1
はジェネレーターでありiter1
、イテレーターでありiter1.next()
、適切な処理を行います。しかしiter1[Symbol.iterator]
、呼び出されたときにiter1
イテレータであるを返す関数を提供します。だから、iter1
両方のは、この場合に反復可能とイテレータのですか?
加えて、iter1
上記の例1とは異なります。これは、例1のイテラブルは[1, 3, 5]
を使用して必要な回数だけ与えることができるの[...bar]
に対し、iter1
はイテラブルですが、それ自体が返されるため、毎回同じイテレータであるため、[1, 3, 5]
1回しか与えられません。
つまり、反復可能であればbar
、何回[...bar]
結果を出すことができると言えるでしょう[1, 3, 5]
か。答えは、状況によって異なります。イテレータはイテレータと同じですか?そして答えは、それらは異なるものですが、イテラブルがイテレータとしてそれ自体を使用する場合、それらは同じになる可能性があります。あれは正しいですか?
iter1
反復可能とイテレータの両方が、この場合にはある?」 -はい。すべてのネイティブイテレータは、自分自身を返すことでイテレート可能であるため、イテレート可能であることが期待される構成にそれらを簡単に渡すことができます。