const str = 'Hello, world!';
const strIter = str[Symbol.iterator]();
console.log(strIter); // StringIterator {}
for(const s of str) {
console.log(s);
}
for(const s of strIter) {
console.log(s);
}
// 두 for .. of 문 모두
// H e l l o , w o r l d ! 출력 (각 문자별 하나의 console.log가 찍힘
next에 인자 넘겨주기
function* gn() {
const num1 = yield '첫번째 숫자 입력';
console.log(num1);
const num2 = yield '두번째 숫자 입력';
console.log(num2);
return num1 + num2;
}
const a = gn();
console.log(a.next()); // {value: "첫번째 숫자 입력", done: false}
// 2 in gn
console.log(a.next(2)); // {value: "두번째 숫자 입력", done: false}
// 4 in gn
console.log(a.next(4)); // {value: 6, done: true}
제너레이터는 값을 미리 만들어 두지 않는다.
필요한 순간까지 계산을 미룰 수 있다.
메모리 관리 측면에서 효율적이다.
무한루프 돌려도 브라우저가 뻗지 않음.
function* gn() {
let index = 0;
while(true) {
yield index++;
}
}
const a = gn();
다른 제너레이터 함수 호출하기
function* gen1() {
yield 'W';
yield 'o';
yield 'r';
yield 'l';
yield 'd';
}
function* gen2() {
yield 'Hello,';
yield* gen1(); // 반복 가능한(iterable) 모든 객체가 올 수 있다.
yield '!';
}
console.log(...gen2());
// 'Hello, W o r l d !'