前提・実現したいこと
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 編集