taquaki-satwo
11/27/2017 - 3:07 PM

イテレータ

JS-イテレータ

// # iterableなオブジェクトを用意する
// iterableなオブジェクト
const iterable = {};

// iterableなオブジェクトはiteratorを持つ = [Symbol.iterator]()メソッドを実行するとiteratorを返す
iterable[Symbol.iterator] = () => {
  // iteratorオブジェクト
  const iterator = {};
  let count = 1;
  // iteratorオブジェクトは.next()メソッドを持つ
  // .next()メソッドを実行するとiteratorResultオブジェクトを返す
  iterator.next = () => {
    // iteratorResultオブジェクトは.valueプロパティと.doneプロパティを持っている
    // .valueプロパティはイテレータから取り出した値
    // .doneプロパティは値を取り出し終えたかの真偽値
    const iteratorResult = (count <= 10)
      ? {value: count++, done: false}
      : {value: undefined, done: true};
    return iteratorResult
  }
  return iterator;
}

// # iteratorから順番に値を取り出す
// iterableなオブジェクトからiteratorを取得する
const iterator = iterable[Symbol.iterator]();
let iteratorResult;

while(true) {
  // 順番に値を取り出す
  iteratorResult = iterator.next();
  // 取り出し終えたらbreak
  if(iteratorResult.done) break;
  console.log(iteratorResult.value);
}

// # for-ofを使う
for(let v of iterable) console.log(v);

/*
# iterableなオブジェクトの種類

* 配列
* 配列の.keys(), .entries()
* 文字列
* イテレータ自身
* ジェネレータ
* Arguments
* TypedArray
* Map
* Set

# iterableなオブジェクトの利用

* for-of
* 配列リテラル
* Array.from
* 引数渡し
* 分割代入
* Map
* Set
* WeakMap
* WeakSet

*/

JS-イテレータ

A Pen by Takaaki Sato on CodePen.

License.