Iterable/Iterator/Generator in JS

동동·2021년 8월 17일
0

1. Iterable

상용 심벌 Symbol.iterator을 키로 하는 메서드를 가지고 있는 객체로서, 해당 메서드를 실행하면 해당 객체를 순회할 수 있는 Iterator를 반환합니다.

2. Iterator

반복을 위해 설계된 특별한 인터페이스를 가진 객체로서, next 메서드를 가지고 있습니다. next 메서드를 실행하면 done과 value 프로퍼티를 가진 객체를 반환하며, value에는 반복의 다음 값이 할당되어 있으며 done에는 반복이 종료되었는지를 나타내는 boolean 값이 할당되어 있습니다.

3. Well-formed-Iterator

Iterator 가 Iterable일 때, Welformed-Iterator 라고 부른다.

4. Generator

Iterator를 반환하는 함수입니다. function 키워드 뒤에 Asterisk(*)를 사용하여 표현하고, yield 키워드를 사용하여 next() 가 호출될 때 Iterator가 반환해야 하는 값과 그 순서를 명시합니다.
제네레이터는 각 yield문 이후 실행이 멈춘다.(코루틴)

Generator는 welformed-iterator를 반환하기 때문에, Generator가 반환한 iterator는 iterable을 사용가능한 곳에서도 사용할 수 있다.

Generator는 문을 값으로 바꿔주는 역할이다.

Generator를 실행하여도 iterator를 반환할 뿐, 순회를 시작하지 않는다. 즉, 지연해서 실행된다. (고 말할 수 있겠다.)

5. Iterable/Iterator protocol

순회가능한 요소들은 Iterable하고, Iterable을 순회하는 함수들은 Iterator의 next를 호출하여 순회할 때, 순회가능한 요소와 순회함수들은 Iterable/Iterator protocol 을 따른다고 말한다.

  • Iterable protocol: Iterable을 순회할 때에는 [[Symbol.iterator]]()(with zero-arguments) 를 호출하여 iterator를 생성하여 순회한다. [[Symbol.iterator]]() 는 일반 함수일수도 있고 제네레이터 함수일수도 있다.

  • Iterator protocol: iterator는 next 메서드를 가지고 있으며, next 메서드를 호출하면(zero or one argument) {done, value}가 반환된다.

    • 어떤 Iterator가 Iterator protocol을 따른다 === next 메서드를 호출하여 일련의 값을 순회할 수 있다.
  • Reference

6. ES6 의 모든 컬렉션 객체(Array, Set, Map), 문자열은 Iterable이다.

WeakMap, WeakSet은 Iterable이 아니다. (내장 이터레이터를 갖지 않는다.)
WeakMap, WeakSet은 컬렉션 내에 몇 개의 값이 있는지 정확하게 알 수 없어 순회할 수 없기 때문이다.

Array와 Set의 기본 이터레이터는 values() 이고, Map의 기본 이터레이터는 entries() 이다.

7. ES6에 Iterable/Iterator 도입된 것의 장점

  • DOM NodeList와 같이 유사배열객체도 Iterable/Iterator protocol을 따르면서,

8. Iterable/Iterator protocol을 사용하는 JS 문법

  • for of
  • spread operator([...])
  • yield*
  • destructuring(const [a, b, c] = [1, 2, 3];)

Follow-up

9. Iterator에 인자 전달하기

Generator함수를 통하여 생성된 iterator는, next() 메서드를 이용하여 인자를 전달받을 수 있다. next() 메서드에 인자를 전달하면 그 인자가 제네레이터 yield문의 값이 된다.

10. Generator 위임하기

profile
작은 실패, 빠른 피드백, 다시 시도

0개의 댓글