이터러블
- 이터러블 프로토콜을 준수한 객체를 이터러블이라고 한다.
- 이터러블은 Symbol.iterator를 프로퍼티 키로 사용한 메서드를 직접 구현하거나, 프로토타입 체인을 통해 상속받은 개체를 말한다. (아직은 직관적인 이해가 가지 않는다.)
이터러블 프로토콜 (직관적으로 이해가 가지 않음)
- Well-known Symbol인 Symbol.iterator를 프로퍼티 키로 사용한 메서드를 직접 구현하거나 프로토타입 체인을 통해 상속받은 Symbol.iterator 메서드를 호출하면 이터레이터 프로토콜을 준수한 이터레이터를 반환한다. 이러한 규약을 이터러블 프로토콜이라고 한다.
- 이터러블 프로토콜을 준수한 객체를 이터러블이라 한다.
- 이터러블은 for of 문으로 순회할 수 있으며, 스프레드 문법 및 디스트럭쳐링 할당의 대상으로 사용할 수 있다.
이터레이터 프로토콜 (직관적으로 이해가 가지 않음)
- 이터러블의 Symbol.iterator 메서드를 호출하면 이터레이터 프로토콜을 준수한 이터레이터를 반환한다.
- 이터레이터는 next 메서드를 소유하며 next 메서드를 호출하면 이터레이터를 순회하며 value와 done 프로퍼티를 갖는 이터레이터 리절트 객체를 반환한다.
- 이러한 규약을 이터레이터 프로토콜이라 하며, 이터레이터 프로토콜을 준수한 객체를 이터레이터라 한다.
- 이터레이터는 이터러블의 요소를 탐색하기 위한 포인터 역할을 한다.
이터러블
- 이터러블 프로토콜을 준수한 객체를 이터러블이라 한다.
- 이터러블인지 확인하는 함수는 다음과 같이 구현할 수 있다.
const isIterable = (v) => v !== null && typeof v[Symbol.iterator] === "function";
// 배열, 문자열, Map, Set 등은 이터러블이다.
console.log(isIterable([])); // true
console.log(isIterable("문자열")); // true
console.log(isIterable(new Map())); // true
console.log(isIterable(new Set())); // true
console.log(isIterable({})); // false
- 배열은 Array.prototype의 Symbol.iterator 메서드를 상속받는 이터러블이다.
- 이터러블은 for ... of 문으로 순회할 수 있으며, 스프레드 문법과 배열 디스트럭쳐링 할당의 대상으로 사용할 수 있다.
const array = [1, 2, 3];
// 배열은 Array.prototype의 Symbol.iterator 메서드를 상속받는 이터러블이다.
console.log(Symbol.iterator in array); // true
// 이터러블인 배열은 for ... of 문으로 순회가 가능하다.
for (const i of array) {
console.log(i);
}
// 이터러블인 배열은 스프레드 문법의 대상으로 사용할 수 있다.
console.log([...array]);
// 이터러블인 배열은 디스트럭처링 할당의 대상으로 사용할 수 있다.
const [a, ...rest] = array;
console.log(a, ...rest);
Symbol.iterator 메서드를 직접 구현하지 않거나 상속받지 않은 일반 객체는 이터러블 프로토콜을 준수한 이터러블이 아니다.따라서 일반 객체는 for ... of 문으로 순회할 수 없으며 스프레드 문법과 배열 디스트럭처링 할당의 대상으로 사용할 수 없다.
const obj = { a: 1, b: 2 };
// 일반 객체는 Symbol.iterable 메서드를 구현하거나 상속받지 않는다.
// 따라서 일반 객체는 이터러블 프로토콜을 준수한 이터러블이 아니다.
console.log(Symbol.iterator in obj); // false
// 이터러블이 아닌 객체는 for ... of 문으로 순회할 수 없다.
for (const i of obj) {
console.log(i);
}
// typeError: obj is not iterable
// 이터러블이 아닌 일반 객체는 배열 디스트럭처링 할당의 대상으로 사용할 수 없다.
const [a, b] = obj;
// typeError: obj is not iterable
하지만 일반 객체도 이터러블 프로토콜을 준수하면 이터러블이 된다.
이를 '사용자 정의 이터러블' 이라고 한다.
'Javascript' 카테고리의 다른 글
(JS) 사용자 정의 이터러블 (1) | 2022.06.13 |
---|---|
(JS) 이터레이터 (0) | 2022.06.11 |
(JS) 프로미스(Promise) (0) | 2022.06.10 |
(JS) Ajax, JSON (stringify, parse 메서드) (0) | 2022.06.09 |
(JS) 이벤트 루프(event loop)와 태스크 큐(task queue) (2) | 2022.06.09 |