제너레이터와 이터레이터

제너레이터와 이터레이터


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

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());

제너레이터는 문장을 값으로 만들수 있고, 이런 값을 순회할 수 있게 만들수 있다.

제너레이터를 이용한 odds


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를 평가하기 까지만 동작하기 때문에 무한루프를 돌거나 프로그램이 멈추지 않는다. 즉 안전하게 무한수열을 만들 수 있다.

좋은 웹페이지 즐겨찾기