제너레이터와 이터레이터

<aside> 💡 function 뒤에 꼭 *를 붙여야 제너레이터로 동작한다!!

</aside>

function* gen() {
  yield 1
  yield 2
  yield 3
}

console.log(gen())
console.log(gen()[Symbol.iterator])
let iter = gen()[Symbol.iterator]()
console.log(iter)
console.log(iter[Symbol.iterator]() == iter)
iter.next()
iter.next()
for (const el of iter) console.log(el)

스크린샷 2022-09-16 오후 4.28.05.png

<aside> 💡

제너레이터도 순회할 수 있는 iterable !!!

</aside>

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

console.log(gen())
console.log(gen()[Symbol.iterator])
let iter = gen()[Symbol.iterator]()
console.log(iter)
console.log(iter[Symbol.iterator]() == iter)
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
for (const el of iter) console.log(el)

스크린샷 2022-09-16 오후 4.31.12.png

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

console.log(gen())
console.log(gen()[Symbol.iterator])
let iter = gen()[Symbol.iterator]()
console.log(iter)
console.log(iter[Symbol.iterator]() == iter)
console.log(iter.next())
for (const el of iter) console.log(el)

스크린샷 2022-09-16 오후 4.32.31.png

<aside> 💡 이는 프로그래머가 로직을 만들어가면서 순회할 수 있는 함수를 만들 수 있다는 아주 중요한 포인트가 된다 !!

</aside>

목차로 이동🚀

odds

<aside> 💡 홀수만 보여주는 함수 순환을 제너레이터를 통해서 만들어보자

</aside>

// infinity와 같은 함수를 만들어도
// next()로 호출되는 경우에만 i++가 진행되기 때문에
// 이와 같은 무한대 구현은 브라우저를 다운시키거나 하지 않는다
function* infinity(i = 0) {
  while (true) yield i++
}

function* limit(i, iter) {
  for (const el of iter) {
    yield el
    if (i === el) return
  }
}

function* odds(i) {
  for (const el of limit(i, infinity(1))) {
    if (el % 2) yield el
  }
}

for(const el of odds(10)) console.log(el)

<aside> 💡 아래와 같이 함수 할당 후 next() 호출시에만 value가 증가 하는 것을 볼 수 있다

</aside>

function* infinity(i = 0) {
  while (true) yield i++
}
let target = infinity()
console.log(target.next())
console.log(target.next())