제너레이터 : 이터레이터이자 이터러블을 생성하는 함수
function *gen() {
yield 1;
yield 2;
yield 3;
return 100; // 이터레이터가 다 돌고 done일때 나오는 값
}
let iter = gen();
// true
console.log(itet[Symbol.iterator]() == iter);
// {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. done: true}
console.log(iter.next());
제너레이터는 문장을 값으로 만들수 있고, 이런 값을 순회할 수 있게 만들수 있다.
function *adds() {
yield 1;
yield 3;
yield 5;
}
let iter = odds();
console.log(iter.next()); // 1 false
console.log(iter.next()); // 3 false
console.log(iter.next()); // 5 false
console.log(iter.next()); // undefined true
위처럼 홀수를 순회하는 이터러블을 생상하는 제너레이터
위 코드는 명시적으로 홀수를 출력하는데 좀더 자동화가 되도록 만들어보자
function *adds(l) {
for(let i=0; i<l; i++) {
if(i % 2) yield i;
}
let iter = odds(10);
console.log(iter.next()); // 1 false
console.log(iter.next()); // 3 false
console.log(iter.next()); // 5 false
console.log(iter.next()); // 7 flase
console.log(iter.next()); // 9 flase
console.log(iter.next()); // undefined true
function * infinity(i = 0) {
while(true) yield i++;
}
let iter3 = infinity();
iter3();
iter3();
iter3();
...
...
위의 코드는 무한히 값을 생성하지만! iter3의 next를 평가하기 까지만 동작하기 때문에 무한루프를 돌거나 프로그램이 멈추지 않는다. 즉 안전하게 무한수열을 만들 수 있다.