JavaScript学んでいる際にイテレーターについて出てきたのですが、いまいちイテレーターがどんなものかがイメージしにくかったので、調べてアウトプットしていこうと思います。
イテレーターとは?
wikipediaさんから引用
イテレータ(英語: iterator)とは、プログラミング言語において配列やそれに類似する集合的データ構造(コレクションあるいはコンテナ)の各要素に対する繰り返し処理の抽象化である。
MDNさんから引用
JavaScript では、イテレーターはシーケンスおよび潜在的には終了時の戻り値を定義するオブジェクトです。
繰り返しの抽象化ということで、for文や、while文の元となっているものだと思います。
あんまりしっくりこないのですが、順々に処理をしていって、あるところまで到達したら終了するみたいな感じだと捉えました。
イテレーターの書き方
MDN イテレーターとジェネレーターを参考にしつつ、書き方をみてみると、
function makeIterator() {
let i = 0;
const iterator = {
next: function() {
if(i > 5){
return {
done: true,
}
}else{
return {
done: false,
value: i++
}
}
}
}
return iterator;
}
const iter = makeIterator();
console.log(iter.next()) // {done: false, value: 0}
console.log(iter.next()) // {done: false, value: 1}
console.log(iter.next()) // {done: false, value: 2}
console.log(iter.next()) // {done: false, value: 3}
console.log(iter.next()) // {done: false, value: 4}
console.log(iter.next()) // {done: false, value: 5}
console.log(iter.next()) // {done: true}
console.log(iter.next()) // {done: true}
というような具合。
- イテレーターを作る関数(今回だと
makeIterator
)があって、その中にイテレーターというオブジェクトを用意する - イテレーターはnextをという関数をもち、その関数はオブジェクトを返す。
- そのオブジェクトの中には
done
とvalue
をもつ。 -
done
がfalseの時には更新処理をし、trueの時にはそれ以上の更新をしない(値を返さない)
こういったルールをもとに書かないとイテレーターにはならないらしい。
最後に
ちなみに、ジェネレーターというものを使えばもう少し楽にイテレーターを作れる。
イテレーターもジェネレーターも、反復可能オブジェクトの作成に利用される。
イテレーターがループ処理の基盤となるようなもので、普段は触れることがなかったが、だいぶ理解が深まったと思います。