[Javascript] 제너레이터와 이터레이터

DaeHoon·2022년 6월 13일
0

Javascript

목록 보기
3/5

1. 제너레이터

  • 이터레이터이자 이터러블을 생성하는 함수

1-1. 예제 코드

  function* gen() {
    yield 1;
    if (false) yield 2;
    yield 3;
  }

  let iter = gen(); // iter라는 변수에 이터레이터 할당
  log(iter[Symbol.iterator]() == iter); // [Symbol.iterator]()는 자신의 이터레이터를 반환한다.
  log(iter.next());
  log(iter.next());
  log(iter.next());
  log(iter.next());

  for (const a of gen()) log(a);
  console.clear();

//output

true
{value: 1, done: false}
{value: 3, done: false}
{value: undefined, done: false}
{value: undefined, done: false}
1
3

  • 제너레이터를 만들 때 함수 명 앞에 *을 붙여준다.

1-2 홀수를 반환하는 이터레이터 만들기


 function* infinity(i = 0) {
    while (true) yield i++;
  }

  function* limit(l, iter) {
    for (const a of iter) {
      yield a;
      if (a == l) return;
    }
  }

  function* odds(l) {
    for (const a of limit(l, infinity(1))) {
      if (a % 2) yield a;
    }
  }

  let iter2 = odds(10);
  log(iter2.next());
  log(iter2.next());
  log(iter2.next());
  log(iter2.next());
  log(iter2.next());
  log(iter2.next());
  log(iter2.next());

  for (const a of odds(40)) log(a);

  console.clear();
  • 홀수를 출력하는 odds 제너레이터는 limit, infinity 제너레이터를 합쳐서 만든 제너레이터다.
  • limit에서 iter라는 인자는 infinity 제너레이터를 받고 있음. for.. of문에서 값이 l과 같아질 때 까지 실행된다.
  • infinity는 i부터 값이 무한으로 증가한다. 이터레이터의 next를 평가할 때 까지만 작동해 프로그램이 멈추거나 하는 현상이 일어나지는 않는다.

1-3. for of, 전개 연산자, 구조 분해, 나머지 연산자 (이터레이터 프로토콜)

  log(...odds(10));
  log([...odds(10), ...odds(20)]); // 전개 연산

  const [head, ...tail] = odds(5); // 구조 분해
  log(head);
  log(tail);

  const [a, b, ...rest] = odds(10);
  log(a);
  log(b);
  log(rest);
profile
평범한 백엔드 개발자

0개의 댓글