ES6에 도입된 기능으로, 순회 가능한 데이터 컬렉션(자료구조)을 만들기 위해서 ECMAScript 사양에 정의하여 미리 약속한 규칙이다.
ES6 이전의 순회 가능한 데이터 컬렉션(배열, 문자열, 유사 배열 객체 등)은 통일된 규약 없이 for문
, for...in문
, forEach 메서드
등의 방법으로 순회가 가능했음.
ES6에서는 순회 가능한 데이터 컬렉션을 이터레이션 프로토콜을 준수하는 이터러블로 통일하여 for...of문
, 스프레드 문법
, 배열 디스트럭처링
할당의 대상으로 사용할 수 있도록 일원화 함.
이터레이션 프로토콜에는 두가지 종류가 존재한다.
Symbol.iterator
를 프로퍼티 키로 사용한 메서드를 직접 구현하거나, 프로토타입 체인을 통해 상속받은Symbol.iterator
를 호출하면이터레이터 프로토콜
을 준수한 이터레이터를 반환함.이터러블 프로토콜
을 준수한 객체를이터러블
이라 함.- 이터러블은
for...of 문
으로 순회가 가능함.스프레드 문법
과배열 디스트럭처링 할당
의 대상으로 사용 가능.
Symbol.iterator
메서드를 호출하면 이터레이터 프로토콜을 준수한이터레이터
를 반환.- 이터레이터는 next 메서드를 소유, next 메서드를 호출 시 이터러블을 순회하며 value와 done 프로퍼티를 갖는
이터레이터 리절트 객체 (iterator result object)
를 반환함.- 이러한 규약을
이터레이터 프로토콜
이라고 함.- 이터레이터는 이터러블의 요소를 탐색하기 위한 포인터 역할을 수행
JS는 이터레이터 프로토콜을 준수한 객체, 빌트인 이터러블
을 제공함.
빌트인 이터러블 | Symbol.iterator 메서드 |
---|---|
Array | Array.prototype[Symbol.iterator] |
String | String.prototype[Symbol.iterator] |
Map | Map.prototype[Symbol.iterator] |
Set | Set.prototype[Symbol.iterator] |
TypeArray | TypeArray.prototype[Symbol.iterator] |
arguments | arguments[Symbol.iterator] |
DOM 컬렉션 | NodeList.prototype[Symbol.iterator] HTMLCollection.prototype[Symbol.iterator] |
for...of
문
for...of
문은 이터러블을 순회하며 이터러블의 요소를 변수에 할당하며,
for...in
의 문과 형식이 매우 유사함.
for (변수선언문 of 이터러블) { ... }
for (변수선언문 in 객체) { ... }
for...in
문은 객체의 프로토타입 체인 상에 존재하는 모든 프로토타입의 프로퍼티 중 프로퍼티 어트리뷰트 [[Enumerable]]
의 값이 true인 프로퍼티를 순회하며 열거함.프로퍼티 키
가 심벌
인 프로퍼티는 열거하지 않음
.유사 배열 객체는 이터러블이 아닌 일반 객체임. 하지만
Array.from
메서드를 통해 배열로 변환시킬 수 있음.
length 프로퍼티
를 갖는 객체임.for 문으로 순회 가능
일반 객체
기 때문에 for ... of 문으로 순회 불가
함배열, arguments, NodeList, HTMLCollection
은 유사 배열 객체이면서 이터러블
이다.Array.from 메서드
를 사용해 배열로 변환시킬 수 있음.
for...of
문, 스프레드 문법
, 배열 디스트럭처링 할당
의 대상으로 사용할 수 있도록 일원화.데이터 공급자(Array, String, Map/Set, Dom컬렉션)
가 하나의 순회방식을 갖도록 규정하여 데이터 소비자(for...of문, 스프레드 문법, Map/Set 생성자)가 효율적으로 다양한 데이터 공급자를 사용할 수 있도록데이터 소비자
<=> 데이터 공급자
간을 서로 연결해주는 인터페이스 역할 수행.일반객체
도 이터레이션 프로토콜을 준수하도록 구현하면 사용자 정의 이터러블
이 됨. Symbol.iterator 메서드
를 구현하고, Symbol.iterator
메서드가 next 메서드를 갖는 이터레이터를 반환하도록 함.데이터가 필요한 시점 이전까지는 미리 데이터를 생성하지 않고, 데이터가 필요한 시점에 맞춰 데이터를 생성하는 기법.
빠른 실행속도
를 기대할 수 있으며, 불필요한 메모리를 소비하지도 않고
, 무한도 표현
할 수 있다는 장점이 있음.따라서,
이터러블
은 순차적으로 데이터를 생성하는 객체를 이야기하며,
지연 평가
는 데이터 생성을 필요한 순간까지 미루는 기법임.
이터러블
은 이러한 지연 평가
를 통해 불필요한 데이터 생성을 피할 수 있으며, 유동적인 데이터 생성이 가능해진다.