[javascript] 제네레이터

김효진·2021년 8월 7일
0
post-thumbnail

💡 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다.

💡console.clear(); 을 통해 console을 깨끗이 할 수 있다.

제네레이터

이터레이터이자 이터러블을 생성하는 함수

이터레이터를 리턴하는 함수

일반 함수에서 *을 붙여 만든다.

function* gen() {
  yield 1;
  yield 2;
  yield 3;
	return 100;
}

let iter= gen();
log(iter.next());
log(iter.next());
log(iter.next());
log(iter.next());

for (const a of gen()) log(a);

제네레이터의 리턴값은 순회할 때 나오는 값이 아니라, done을 할 때 나오는 값이다.

odds 함수 만들기

  1. 직접 yield를 통해 만들기
function *odds() {
    yield 1;
    yield 3;
    yield 5;
}
constiter2= odds();
log(iter2.next());
log(iter2.next());
log(iter2.next());
  1. for문으로 만들기
function *odds(l) {
    for (let i = 0; i < l; i++) {
        if(i % 2) yield i;
    }
}
constiter2= odds(10);
log(iter2.next());
log(iter2.next());
log(iter2.next());
log(iter2.next());
  1. infinity함수를 만들어서 만들기
function *infinity(i = 0) {
  while (true) yield i++;
}

function *odds(l) {
    for (const a of infinity(1)) {
        if (a % 2) yield a;
        if (a === l) return;
    }
}

infinity는 이터레이터를 무한대로 만들어내는 함수다.

  1. limit함수 를 만들어서 만들기
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 limit(l, infinity(1))) {
    if (a % 2) yield a;
  }
}

for of, 전개 연산자, 구조 분해, 나머지 연산자

log(...odds(10));
log([...odds(10), ...odds(20)]);

const [head, ...tail] = odds(5);
log(head); // 리스트의 맨 앞
log(tail); // 나머지

const [a,b, ...rest] = odds(10);
log(a); // 리스트의 첫번째 요소
log(b); // 리스트의 두번째 요소
log(rest); // 나머지
profile
맨땅에 헤딩 🐣

0개의 댓글