iterator와 iterable에 대해 알아보자!

jinn2u·2021년 8월 13일
1

js

목록 보기
2/4

Symbol이란?

  • Symbol이란 객체에 Unique한 속성을 만들기 위해 사용됩니다.
  • 왜 Unique가 필요하냐면 다른 라이브러리와의 충돌을 막기 위함입니다.
  • Symbol.iterator는 상용심볼로써 이터러블한 객체를 정의하기 위한 심볼입니다.

이터레이터란 무엇일까요?

  • 이버러블 객체가 [Symbol.iterator]() 메소드로 반환하는 이터레이터 객체는 무엇일까요?
  • next메소드를 구현하고 있고, done과 value 속성을 가진 객체를 반환하는 객체를 말합니다.
  • 즉 아래와 같은 코드는 이터레이터라고 할 수 있습니다.
const fakeIter = () => {
  return {
    next() {
      return { value: 1000, done: false };
    },
  };
};

그렇다면 이터러블이란 무엇일까요?

  • Symbol.iterator심볼을 속성으로 가지고 있고, 이터레이터 객체를 반환하는 객체를 뜻합니다.
const iterable = {
  [Symbol.iterator]() {
    let i = 3;
    return {
      next() {
        return i == 0 ? { done: true } : { value: i--, done: false };
      },
    };
  },
};
console.log(iterable[Symbol.iterator]().next()); // 3
for (const a of iterable) console.log(a); //  3 2 1 순으로 순회가 가능합니다.
  • 여기서 문제점은 iterable이 얼마나 순회하였는지를 기억하지 못한다는것입니다.

문제 해결하기

const iterable = {
  [Symbol.iterator]() {
    let i = 3;
    return {
      next() {
        return i == 0 ? { done: true } : { value: i--, done: false };
      },
      [Symbol.iterator]() {
        return this
      }, // well-formed iterable
    };
  },
};
let iterator = iterable[Symbol.iterator]();
console.log(iterator.next().value); // 3
for (const a of iterator) console.log(a); // 2 1
  • iterable[Symbol.iterator]() == iterable텍스트 이 되게 함으로써 자기 자신이 얼마나 순회하였는지 기억할 수 있는 wellformed iterable이 됩니다.

this가 아닌 다른 값을 참조한다면?

const iterable = {
  [Symbol.iterator]() {
    let i = 3;
    return {
      next() {
        return i == 0 ? { done: true } : { value: i--, done: false };
      },
      [Symbol.iterator]() {
        return fakeIter();
      },
    };
  },
};
let iterator = iterable[Symbol.iterator]();
console.log(iterator.next()); // { value: 3, done: false }
for (const a of iterator) console.log(a); // 1000이 무한반복됩니다.

따라서 자기 자신을 참조하여 얼마나 순회하였는지 기억할 수 있게 합니다.!

0개의 댓글