JavaScript/함수형 프로그래밍과 JavaScript ES6+
제너레이터와 이터레이터
정ㅇr
2021. 11. 24. 18:51
728x90
1) 제너레이터와 이터레이터
제너레이터 : 이터레이터이자 이터러블을 생성하는 함수, well-formed iterator를 리턴하는 함수
어떠한 값들을 제너레이터를 통해서 이터러블로 만들고, for.. of 문을 통해 순회를 할 수 있게 만들 수 있다는 것!
function *gen() {
yield 1;
yield 2;
yield 3;
}
let iter = gen();
console.log(iter[Symbol.iterator]() == iter); // true 반환
예제
10까지의 홀수만 뽑아내는 제너레이터 함수
function *odds(l) {
for(let i = 0; i < l; i++) {
if (i % 2) yield i;
}
}
let iter2 = odds(10);
console.log(iter2.next());
console.log(iter2.next());
console.log(iter2.next());
console.log(iter2.next());
console.log(iter2.next());
무한수열
function *infinity(i = 0) {
while (true) yield i++;
}
let iter = infinity();
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
next 함수를 사용해서 계속 출력해도, 사용자가 입력해야지만 계속해서 출력되는 것이기 때문에
브라우저가 멈추는 버그는 생기지 않는다.
2) odds
// odds
// 무한수열 표현
// 평가하는 시점에 실행되기 때문에 프로그램이 멈추거나 하는 현상은 없다
function *infinity(i = 0) {
while (true) yield i++;
}
function *limit(l, iter) {
for (const a of iter) {
yield a;
if (a == l) return;
}
}
function *odds(l) {
for (const a of infinity(1)) {
if (a % 2) yield a;
if (a == l) return;
}
}
let iter2 = odds(10);
console.log(iter2.next());
console.log(iter2.next());
console.log(iter2.next());
console.log(iter2.next());
console.log(iter2.next());
// 제너레이터 함수 순회 방법
for (const a of odds(50)) {
console.log(a);
}
제너레이터 함수 관련 다양한 예제
3) for...of, 전개 연산자, 구조 분해, 나머지 연산자
// 전개 연산자
console.log(...odds(10));
console.log([...odds(10), ...odds(20)]); // 배열로 변환
// 구조 분해
const [head, ...tail] = odds(5);
console.log(...odds(5)); // 1 3 5
console.log(head); // 1
console.log(tail); // [3, 5]
const [a, b, ...rest] = odds(10);
console.log(a);
console.log(b);
console.log(rest);
반응형