웹프로그래밍 : Iterators and Generators

chanyeong yu ·2025년 4월 21일

웹프로그래밍

목록 보기
9/12

Iterators and Generators

Iterable Object

let sum = 0;
for (let i of [1, 2, 3]) {
  sum += i;
}
sum; // => 6
  • 배열은 iterable하다. for/of를 통해서 출력이 가능하다.
  • Iterator는 스프레드 오퍼레이터도 사용할 수 있다.

Iterable Object

let m = new Map([
  ["one", 1],
  ["two", 2],
]);
for (let [k, v] of m) console.log(k, v);
/
new Set("abc"); // => new Set(["a", "b", "c"])
  • Map과 Set을 통해서도 이터레이블한 배열을 만들어낼 수 있다.

How Iterators Work

Symbol.iterator

  • 상속받은 프로퍼티 영역에서 Symbol.iterator 를 가지고 있는 것을 확인해야한다. 이는 메소드이고 호출하면 Array Iterator{} 객체를 반환한다. 이 객체는 next() 라는 메소드를 지니고 있다.

next()를 호출해보자.

let a = [1,2,3]
b = a[Symbol.iterator]() //Array Iterator{}
b.next() //{value: 1, done: false}
b.next() //{value: 2, done: false}
b.next() //{value: 3, done: false}
b.next() //{value: undefined, done: true}
let head = iter.next().value; // head == 1
iter.next();
let tail = [...iter]; // tail == [3,4,5]
console.log(tail);
  • next()는 한번 뽑으면 끝.... 스프레드 오퍼레이터로 전부 출력할 수 있다.

Generators

function* oneDigitPrimes() {
  yield 2; 
  yield 3;
  yield 5; 
  yield 7; 
}
let primes = oneDigitPrimes();
/
primes.next().value; //=>2
primes.next().value; //=>3
primes.next().value; //=>5
primes.next().value; //=>7
primes.next().done; // => true
  • Iterators처럼 next()를 통해서 객체를 던져준다.
function* oneDigitPrimes() {
  // Invoking this function does not run the code
  yield 2; // but just returns a generator object. Calling
  yield 3; // the next() method of that generator runs
  yield 5; // the code until a yield statement provides
  yield 7; // the return value for the next() method.
}

function* sequence(...iterables) {
  for (let iterable of iterables) {
    for (let item of iterable) {
      yield item;
    }
  }
}
//or
function* sequence(...iterables) {
  for (let iterable of iterables) {
    yield* iterable; //yield에 별표 찍고 있음.
  }
}
console.log([...sequence("abc", oneDigitPrimes())]); 
// => ["a","b","c",2,3,5,7]  

0개의 댓글