1. 이터레이터와 제너레이터 프로토콜

  • 자바스크립트 스펙에 정의 되어 있는 프로토콜로써, 많은 표준 자바스크립트 객체에서 사용되는 프로토콜이다
  • 해당 프로토콜을 이용하여 활용도 높은 함수형 프로그래밍을 구현 할 수 있다
// 제너레이터를 이용한 무한수열 함수
function *ger() {
  const init = 0;
  while(true) {
    yield ++ init;
  }
}

const iter = ger();    //제너레이터는 이터레이터를 반환 한다
iter.next();    // 안전하게 무한히 증가하는 함수를 구현 할 수 있다
iter.next();
iter.next();
  • 잘 만들어진 이터레블 객체는 자기 자신, 즉 이터러블을 반환 하여 지속적인 사용이 가능하다
  • 그 예로는 array 객체의 filter, map 등의 함수 등을 통해 확인 할 수 있다
    아래의 코드처럼 filter 함수 다음에 map 함수의 체이닝이 가능한 이유는 filter 함수는 이터러블 객체를
    반환하여 map 함수 내에서 다시 이터러블 객체를 통해 순회하여 값을 표출한다.
const arr = [1, 2, 3, 4, 5];
const result = arr.filter(value => value < 3).map(value => console.log(value));

이터레이터 프로토콜

이터레이터의 next() 함수가 호출 될때마다 반환 값은 {value: 1, done: false} 형식으로 value 안에 yield 된 값이 반환 된다. 동일한 이터레이터 객체로 지속적으로 호출하면 done: true가 될때까지 value를 반환 한다

2. 활용하기

  • 함수의 추상화를 높은 수준으로 구현 가능하여, 함수의 활용성과 가독성을 높일 수 있다.
  • 아래의 코드는 간단한 예이다
const obj = [1, 2, 3, 4, 5, 6];
const add = (a, b) => a + b;

//간단한 필터 제너레이터
const filter = function filter(f, param) {
  const arr = [];
  for(let i of param) {
    if(f(i)) arr.push(i);
  }
  return arr;
}

// 외부에서 함수를 전달하여 평가한다
// 필터 함수를 제너레이터 함수로 만들면 지연 평가 할 수도 있다
console.log(filter((i) => i < 10, obj));