[関数式プログラミングとES 6+]2.for of, iterable, iterator


ES 6巡回


for of


ES 5ツアーよりも宣言的です.
const arr = [1, 2, 3];

//es5 - Array객체의 length 프로퍼티를 활용한다.
for (var i = 0; i < arr.length; i++) {
	console.log(arr[i]);
}

//es6
for (const el of arr) {
  console.log(el);
}
es 5では,Set,Mapオブジェクトは巡回していない.しかしes 6ではfor of文で巡回することができる.

why?


[Symbol.iterator]!

なぜならofはどのように操作されているのか


オブジェクトに[Symbol.iterator] propertyのiteratorメソッドがある場合、for ofは操作します.
反例として、Arrayオブジェクトの[Symbol.iterator]にnullを指定した場合、forは機能しません.

iterable/iteratorプロトコルとは?


JSのSet、Map、Arrayはiterable/iteratorプロトコルに従います.

  • iterable/iteratorプロトコル:iterableの動作規則

  • iterable:iteratorの[Symbol.iterator]メソッドの値を返します.
    Arrayオブジェクトはiterableです.

  • iterator:{ value, done }は、オブジェクトのnextメソッドの値を返します.
  • forの内部作業方式

    const arr = [1, 2, 3];
    const iterator = arr.[Symbol.iterator]();
    // iterator.next()가 리턴한 객체를 done프로퍼티가 true가 될 때까지 순차적으로 value프로퍼티 값을 반환한다.

    map.keys(), map.values(), map.entries()...


    これらのメソッドはiteratorを返します.ただし、[Symbol.iterator]があり、for of MoonなどのIterableプロトコルコードで使用できます.([Symbol.iterator]が自分を引用しているため)

    well-formed iterator

  • 反復器を[Symbol.iterator]の値で自己に戻す場合は、フォーマットの良い反復器と呼ばれます.
  • 反復器はfor of Moonなどで巡回することもできます
    -next()を何回か呼び出した後、for of文などに渡し、next()を行った後の値を返します.
  • カスタムイテレーション/イテレーションプロトコルの定義

    // 이런 형태를 띄우고 있다.
    cosnt iterable = {
      [Symbol.iterator]() {
        return {
            next() {
              return { value, done }
            },
          	[Symbol.iterator]() {
              return this;
            }
         }
      }
    }