이터레이션(Iteration): 반복
const list = [10, 20]; for (let value of list) { console.log(value); }; // 10 // 20 const obj = list[Symbol.iterator](); console.log(obj.next()); console.log(obj.next()); console.log(obj.next()); // {value: 10, done: false} // {value: 20, done: false} // {value: undefined, done: true}
이터레이션을 위한 프로토콜(protocol)필요
ex: 통신 프로토콜(규약) - 데이터 송수신 프로토콜 정의
즉, 이터레이션은 프로토콜을 가지고 있으며 프로토콜에 따라 이터레이션을 수행합니다.
프로토콜이 구문과 빌트인이 아니므로 프로토콜에 맞으면 이터레이션이 가능합니다.
개발자 코드로 프로토콜을 맞추면
- 이터레이션 할 수 없는 오브젝트를 이터레이션 할 수 있도록 만들 수도 있습니다.
const list = [10, 20]; console.log(list[Symbol.iterator]); // function values(){ [native code] }
오브젝트가 반복 가능한 구조이어야 하며 Symbol.iterator를 가지고 있는 것 입니다.
아래의 빌트인 오브젝트는 디폴트로 이터러블 프로토콜이 있습니다. 즉, Symbol.iterator를 가지고 있습니다.
Array, Argument, String, TypedArray, Map, Set, DOM NodeList
const list = [10, 20]; console.log(list[Symbol.iterator]); // function values(){ [native code] } const obj = {one: 10, two: 20}; console.log(obj[Symbol.iterator]); // undefined
⇒ [ ] 리터럴로 생성한 list에 Symbol.iterator가 있기에 Array는 이터러블 오브젝트 입니다.
⇒ { } 리터럴로 생성한 obj에 Symbol.iterator가 없기에 Object는 이터러블 오브젝트가 아닙니다.
⇒ for문의 반복과 이터레이션이 차이가 있듯이 for-in의 열거와 이터레이션은 차이가 있습니다.
obj를 열거는 가능하지만, 이터레이션은 불가능합니다.
list의 scope를 확인하면 __proto__가 있고 이를 펼치면 Array 오브젝트의 메소드가 나열됩니다.
이를 살펴보면 Symbol(Symbol.iterator)가 있습니다.
그렇기 때문에 Array 오브젝트는 이터러블 오브젝트입니다.
또한, Symbol(Symbol.iterator)를 펼치면 __proto__에 Function 오브젝트의 메소드가 연결되어 있기에 Symbol.iterator는 함수입니다. 그렇기에 호출할 수 있습니다.
값을 순서대로 생성하는 방법(규약)
const list = [10, 20]; const obj = list[Symbol.iterator](); console.log(obj.next()); console.log(obj.next()); console.log(obj.next()); // {value: 10, done: false} // {value: 20, done: false} // {value: undefined, done: true}
next()
를 호출하면 이터레이터를 호출한다고도 합니다. 개발자 코드로 프로토콜을 맞추면 이터레이션 할 수 없는 오브젝트를 이터레이션 할 수 있도록 만들 수도 있습니다.