제너레이터는 이터레이터를 생성하는 함수이다.
제너레이터를 사용해 모든 순회 가능한 것들을 직접 생성할 수 있다.
제너레이터는 아래와 같이 *와 yield를 사용해 만들 수 있다.
제너레이터는 화살표 함수로 만들 수 없다.
function gen*(l) {
while (l < 0){
yield l--
}
}
const get5 = gen(5);
log(get5[Symbol.iterator]());
get5[Symbol.iterator]()
는 다음과 같이 콘솔에서 제너레이터임을 알 수 있다.
즉 제너레이터이므로 이터레이터를 가지고 있기 때문에
for of 를 사용해 순회할 수 있다.
for (const a of get5) {
log(a)
}
이터러블을 돌면서 홀수만 출력하는 제너레이터를 만들어보자
funtion odds*(iter){
for (const a of iter){
if (a % 2) yield a;
}
}
log(odds(gen(10)); // 9 7 5 3 1 출력
1부터 출력하기위해 다른 제너레이터 함수를 만들어보겠다.
function infinity*(l = 1){
while (true) {
yield l++;
}
}
function limit*(l, iter){
for (const a of iter ) {
yield a;
if (iter === l){
return;
}
}
}
1부터 숫자를 늘려가면서 이터레이터를 반환하는 인피니티와, 특정 숫자까지 도달하면 리턴하는 리밋 제너레이터를 만들었다.
function odds*(l){
for (const a of limit(l, infinity(1)){
if (a % 2) yield a;
}
}
const iter2 = odds(10);
for (const a of iter2) {
log (a);
}
다음과 같이 1부터 제한한 숫자까지 홀수만 출력할 수 있다.