과정 중간에 이터레이션 개념 이해가 필요하므로
이터레이션의 사전적 의미: 반복
const list = [10, 20];
for (let value of list) {
log(value);
};
const obj = list[Symbol.iterator]();
log(obj.next());
log(obj.next());
log(obj.next());
// 10
// 20
// {value: 10, done: false}
// {value: 20, done: false}
// {value: undefined, done: true}
이터레이션을 위한 프로토콜(protocol) 필요
즉, 이터레이션은 프로토콜을 갖고 있으며
const list = [10, 20];
const obj = list[Symbol.iterator]();
log(obj.next());
log(obj.next());
log(obj.next());
// {value: 10, done: false}
// {value: 20, done: false}
// {value: undefined, done: true}
const list = [10, 20];
log(list[Symbol.iterator]);
// function values() { [native code] }
/*
1. [] 리터럴로 생성한 list에 Symbol.iterator가 있으므로 Array는 이터러블 오브젝트
2. {} 리터럴로 생성한 obj에 Symbol.iterator가 없으므로 Object는 이터러블 오브젝트가 아님
3. for 문의 반복과 이터레이션이 차이가 있듯이 for-in의 열거와 이터레이션은 차이가 있음
*/
const list = [10, 20];
log(list[Symbol.iterator]);
const obj = {one: 10, two: 20};
log(obj[Symbol.iterator]);
// function values() { [native code] }
// undefined
이터러블 오브젝트 구조
자체 오브젝트에는 없지만
__proto__
)에 있으면 됨/*
1. 이터레이터 오브젝트의 next()를 호출하면 이터레이터를 호출한다고도 함
2. {value: 10, done: false}를 반환. value는 [10, 20]에서 첫 번째 값이고 done: false는 이터레이터 상태
3. 두 번째 next() 호출
4. {value: 20, done: false}를 반환. value는 [10, 20]에서 두 번째 값이고 done: false는 이터레이터 상태
5. 세 번째 next() 호출
6. {value: undefined, done: true} 반환. undefined는 처리할 값이 없다는 것을 뜻하며 done: true는 이터레이터의 종료를 뜻함
*/
const list = [10, 20];
const obj = list[Symbol.iterator]();
log(obj.next());
log(obj.next());
log(obj.next());
// {value: 10, done: false}
// {value: 20, done: false}
// {value: undefined, done: true}