iterator이자 iterable을 생성하는 함수
순회할 값을 문장으로 표현
어떠한 값이든 순회할 수 있도록 만들어준다!
function *generataor() {
yield 1;
yield 2;
yield 3;
}
let iter = generataor();
console.log(iter[Symbol.iterator]() == iter); // true
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, done: true}
제너레이터 함수에 return을 하면, 마지막 value 값에 리턴한 값이 담긴다.
function *generataor() {
yield 1;
yield 2;
yield 3;
return 100;
}
let iter = generataor();
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: 100, done: true}
일반 for문을 순회할 때는 return 값이 출력되지 않는다.
return 값은 next() 함수를 이용했을 때, done 값에 담긴다.
function *generataor() {
yield 1;
yield 2;
yield 3;
return 100;
}
let iter = generataor();
for(const a of generataor()) console.log(a);
1
2
3
function *odds(n) {
for(let i=0; i<n; i++) {
if(i % 2) yield i;
}
}
let iter = odds(10);
console.log(iter.next()); // {value: 1, done: false}
console.log(iter.next()); // {value: 3, done: false}
console.log(iter.next()); // {value: 5, done: false}
console.log(iter.next()); // {value: 7, done: false}
console.log(iter.next()); // {value: 9, done: false}
위의 예제에서 좀 더 심화된 코드로 작성해보자.
function *infinity(i=1) {
while(true) yield i++;
}
function *odds(l) {
for(const a of infinity(1)) {
if(a % 2) yield a;
if(a == l) return;
}
}
let iter = odds(10);
console.log(iter.next()); // {value: 1, done: false}
console.log(iter.next()); // {value: 3, done: false}
console.log(iter.next()); // {value: 5, done: false}
console.log(iter.next()); // {value: 7, done: false}
console.log(iter.next()); // {value: 9, done: false}
for처럼 전개 연산자, 구조 분해, 그리고 나머지 연산자에서도 generator 함수를 사용할 수 있다.
function *odds(n) {
for(let i=0; i<n; i++) {
if(i % 2) yield i;
}
}
// 전개 연산자
console.log(...odds(10));
console.log([...odds(10), ...odds(20)]);
// 1 3 5 7 9
// [1, 3, 5, 7, 9, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
// 구조 분해
let [start, ...end] = odds(10);
console.log(start);
console.log(end);
// 1
// [3, 5, 7, 9]
// 나머지 연산자
let [a, b, ...rest] = odds(10);
console.log(a);
console.log(b);
console.log(rest);
// 1
// 3
// [5, 7, 9]