ES6이후에 순회 가능한 데이터 컬렉션을 이터레이션 프로토콜을 준수하는 이터러블로 통일하여 for..of문, 스프레드 문법, 배열 디스트럭처링 할당의 대상으로 사용할 수 있도록 일원화 했습니다.
이터레이션 프로토콜은 다양한 데이터 소스가 하나의 순회 방식을 갖도록 규정하여 데이터 소비자가 효율적으로 다양한 데이터 소스를 사용할 수 있도록 데이터 소비자와 데이터 소스를 연결하는 인터페이스의 역할
을 한다.poiemaweb 참고
이터러블이란 이터러블 프로토콜을 준수한 객체를 말합니다.
이터러블 프로토콜을 준수한 객체란? -> Symbol.iterator 메소드를 가지고 있으면서 next()를 호출할 수 있으면 된다~
Symbol.iterator 메소드를 가지고 있어야 합니다.
이때 Symbol.iterator 메소드를 호출하면 이터레이터 객체를 얻습니다.
이터레이터 객체는 next()를 가지고 있고, next() 호출하여 이터레이터 리절트 객체를 반환합니다. Ex) 리절트객체 : {value:1, done:true}
Symbol.iterator를 프로퍼티 키로 사용한 메서드를 직접 구현하거나, 프로토타입 체인을 통해 상속받은 객체를 말합니다.
쉽게말해 Symbol.iterator를 가지고 있으면 이터러블하다~ 라고 할 수 있습니다.
이터러블은 for.. of 문으로 순회할 수 있고, 스프레드 문법과, 배열 디스트럭처링 할당의 대상으로 사용할 수 있습니다.
[]
: 이터러블 OHola
: 이터러블 O{}
: 이터러블 X이터러블의 Symbol.iterator 메서드를 호출하면
이터레이터 프로토콜을 준수한 이터레이터를 반환
합니다.
이터레이터 프로토콜은 next 메소드를 소유하며 next 메소드를 호출하면 이터러블을 순회하며 value, done 프로퍼티를 갖는 이터레이터 리절트 객체를 반환하는 것입니다.
즉 이터러블의 Symbol.interator 메서드를 호출하면 이터레이터를 얻을 수 있습니다.
아래의 사진에서 Array Iterator {}
를 반환하는데, 이것이 이터레이터 입니다.
이때 iterator는 next 메소드를 가지고 있고, 이것은 이터러블의 각 요소를 순회하기 위한 포인터 역할을 합니다.
next 메서드를 호출하면 이터러블을 순차적으로 한 단계씩 순회하며 순회 결과를 나타내는데, 이때 이터레이터 리절트 객체를 반환합니다.
아래의 사진에서 {value:1, done:false}
와 같이 이터레이터 리절트 객체를 반환합니다.
앞에서 이터러블은 Symbol.iterator를 프로퍼티 키로 가지고 있으면 된다고 했습니다.
그럼 이터러블이 아닌 객체를 Symbol.iterator 프로퍼티를 추가해서 이터러블로 바꿔 for of 문으로 순회 해보겠습니다.
이터러블이란 Symbol.iterator를 가지고 있으면 된다고 했습니다.
그러면 Symbol.iterator를 제거하면 이터러블이 아닐까요? 따라서 for... of문으로 순회할 수 없을까요??
아래의 사진과 같이 Symbol.iterator를 제거하면 이터러블이 아니라는 에러가 발생합니다.