파트2. ES6에서의 순회와 이터러블 이터레이터 프로토콜 - ChoDragon9/posts GitHub Wiki

기존과 달라진 ES6에서의 리스트 순회

  • for i++
  • for of
const list = [1, 2, 3];
for (let i = 0; i < list.length; i++) {
  console.log(list[i]);
}
for(const a of list) {
  console.log(a);
}

이터러블/이터레이터 프로토콜

  • 이터러블 : 이터레이터를 리턴하는 [Symbol.iterator]()를 가진 값
  • 이터레이터: { value, done } 객체를 리턴하는 next()를 가진 값
  • 이터러블/이터레이터 프로토콜 : 이터러블을 for...of, 전개 연산자 등과 함께 동작하도록한 규약
const arr = [1, 2, 3];
const iterator = arr[Symbol.iterator](); //Array Iterator
iterator.next(); // { value: 1, done: false}
iterator.next(); // { value: 2, done: false}
iterator.next(); // { value: 3, done: false}
iterator.next(); // { value: undefined, done: true}
const set = new Set([1, 2, 3]);
const setIterator = set[Symbol.iterator](); //SetIterator

const map = new Map([1, 1], [2, 2], [3, 3](/ChoDragon9/posts/wiki/1,-1],-[2,-2],-[3,-3));
const mapIterator = map[Symbol.iterator](); //MapIterator

사용자 정의 이터러블을 통해 알아보기

const iterable = {
  [Symbol.iterator]() {
    let limit = 3;
    return {
      next() {
        return limit < 1 ? {done: true} : { value: limit--, done: false }
      }
    }
  }
}
const iterator = iterable[Symbol.iterator]();
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());

for (const a of iterable) {
  console.log(a);
}

Iterator는 반드시 자기자신을 리턴하는 Symbol.iterator를 구현되어야 함을 스펙문서에 명시되어 있습니다.

const arr = [1, 2, 3];
const iterator = arr[Symbol.iterator]();
console.log(iterator.next().value);
for ( const a of iterator) { console.log(a); }

전개연산자

사용자 정의 이터러블은 Iterator내에 [Symbol.iterator]가 정의될 때 정상적으로 동작합니다.

const iterable = {
  [Symbol.iterator]: function() {
    let limit = 3;
    return {
      next() {
        return limit < 1 ? {done: true} : { value: limit--, done: false }
      },
      [Symbol.iterator]: function() { return this }
    }
  }
}

console.log([...iterable]);