이터러블 : 이터레이터를 리턴하는 [Symbol.iterator]() 를 가진 값
이터레이터: { value, done } 객체를 리턴하는 next() 를 가진 값
이터러블 / 이터레이터 프로토콜 : 이터러블을 for...of, 전개 연산자 등과 함께 동작하도록한 규약
const iterable = {
[Symbol.iterator]() {
let i = 3;
return {
next() {
return i == 0 ? { done : true } : { value : i--, done: false }
}
}
}
}
let iterator = iterable[Symbol.iterator]();
console.log(iterator.next()) /// 3
console.log(iterator.next()) /// 2
console.log(iterator.next()) /// 1
이터레이터이자 이터러블을 생성하는 함수
function *gen() {
yield 1;
yield 2;
yield 3;
return 100
}
let iter = gen();
log(iter[Symbol.iterator]() === iter) // true
log(iter.next()) /// { value : 1, done: false }
log(iter.next()) /// { value : 2, done: false }
log(iter.next()) /// { value : 3, done: false }
log(iter.next()) /// { value : 100, done: true }
for(const a of gen()) console.log(a) /// 1 2 3
제네레이터의 리턴값은 done : true 일때 나오는 값