
제너러이터는 이터레이터이자 이터러블을 생성하는 함수를 말한다. 즉, 이터레이터를 리턴하는 함수다.
// 제너레이터는 일반 함수에서 앞에 별을 붙여 만든다.
function *gen() {
yield 1;
yield 2;
yield 3;
// 마지막에 return 값을 만들수도 있다.
return 100;
}
//제너레이터를 실행한 결과는 이터레이터다.
let iter = gen();
console.log(iter.next()); // {value: 1, done: false}
console.log(iter.next()); // {value: 2, done: false}
console.log(iter.next()); // {value: 3, done: false}
console.log(iter.next()); // {value: undefined(or 100), done: true}
위와 같이 제너레이터를 통해 굉장히 쉽게 이터레이터를 만들 수 있다. 이 이터레이터는 이터레이터이자 이터러블이기도 하다. 이터레이터는 심볼 이터레이터를 가지고 있고, 그것의 실행 결과는 자기 자신이다. 그러니까 제너레이터는 Well-formed iterator 를 리턴하는 함수다.
console.log(iter[Symbol.iterator]() == iter); // true
그리고 제너레이터에서 yield를 통해서 몇번의 넥스트를 통해 값을 꺼내 줄 것인지를 정할 수 있다. 그리고 제너레이터를 사용하게 되면 그 실행결과가 이터러블이자 이터레이터이기 때문에 순회할 수 있다.
for (const a of gen()) console.log(a);
제너레이터라는 문장을 통해 순회할 수 있는 값을 만들 수 있기 떄문에 자바스크립트에서는 이를 이용해 어떠한 상태나 어떠한 값이든 순회할 수 있게 만들 수 있다. 이는 함수형 프로그래밍의 관점에서 굉장히 중요한 부분이다.
또한 다형성이 굉장히 높다.
function *odds() {
yield 1;
yield 3;
yield 5;
yield 7;
}
let iter2 = odds();
console.log(iter2.next()):
console.log(iter2.next()):
console.log(iter2.next()):
console.log(iter2.next()):
console.log(iter2.next()):
위의 코드를 자동화해서 만들면 아래와 같다.