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