前提・実現したいこと
JavaScriptでイテレータ, ジェネレータを使ったプログラムを学習しました.
このうちイテレータについての質問です.
先ず, 私の理解している部分の共有のため,イテレータ, ジェネレータ, iterableの説明を記述致します.
イテレータ
次の要素を返す関数を持ち, その関数の返り値として, 次の要素の値と, その要素でイテレータが終了するかの真偽値を返すオブジェクトを指す. イテレータは, iterableではない.
ジェネレータ
function*により, ジェネレータを用いた関数を定義できる. その関数を定義すると, その返り値として, Generatorオブジェクトが返される. Generatorオブジェクトはイテレータである. Generatorオブジェクトの持つ関数を実行すると, yield式が出現するまで処理を継続する. そして, yield式が出現した時点で処理を停止し, 再び該当Generatorオブジェクトの関数が呼び出されるまでの間, 後続処理を行わない. ジェネレータは, Symbol.iteratorをキーとした関数を持つため, iterableである.
iterable
Symbol.iteratorをキーとした関数を持ち, for-of構文を用いることで反復処理が可能なオブジェクトを指す.
発生している問題・エラーメッセージ
Symbol.iteratorプロパティとは何をしているのか?- イテレータと
iterableには, どのような関係があるのか?
といった所が, 理解出来ずにいます.
for-of構文とは, __イテレータの中身を1つずつ取り出し, 取り出されたオブジェクトに対して, 処理を行うことが出来る文__なので, イテレータであればfor-of構文で実行可能なのではないか, と考えていました. しかし, 実際の所は, イテレータであるだけでなく, iterableでなければありません.
またイテレータは, 次の要素と, その要素でイテレータが終了するかを返します. そのため, for構文やwhile構文を用いることで, 反復処理が可能な筈なので, iterableではないか, と考えました. しかし, これはfor-of構文で処理を行えないため, iterableとは言えません. イテレータをiterableにするには, Symbol.iteratorプロパティを実装しなければなりません. ではいったい, このSymbol.iteratorプロパティではどのような処理をしているのか?という所を, 教えて頂きたいです.
JAvaScript
1let iter = { 2 index: 0, 3 next: function () { 4 this.index += 1; 5 return { 6 value: this.index, 7 done: false 8 } 9 } 10}; 11 12for (let i = 0; i < 100; i++) { 13 console.log(iter5.next().value); 14} 15 16for (it of iter) { 17 console.log(it.value); // => TypeError: iter is not iterable 18}
補足情報(FW/ツールのバージョンなど)
以下に記載したウェブサイトにて, __Symbol.iteratorプロパティとは何をしているのか?__を調査しましたが, Symbol.iteratorプロパティの内部で, 新たにジェネレータ(イテレータ)を用いているソースコードを発見し, 通常のイテレータと, それに実装するSymbol.iteratorプロパティの関係(イテレータとiterableの関係)について, 混乱してしまい, 今回の質問をするまでに至りました.
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/26 09:54 編集