이터러블
Symbol.iterator를 프로퍼티 키로 사용한 메서드를 구현하거나 프로토타입 체인을 통해 상속받은 객체.
- for ... of 문으로 순회할 수 있습니다.
- 스프레드 문법, 배열 디스트럭처링 할당을 사용할 수 있습니다.
const arr = [1, 2, 3];
// Symbol.iterator 메서드
console.log(Symbol.iterator in arr) // true;
// for .. of 문
for (const val of arr) {
console.log(val);
}
// 스프레드 문법
const arr2 = [...arr];
// 배열 구조분해 할당
const [val1, val2] = arr;
이터레이터
이터러블 객체의 Symbol.iterator 메소드를 호출하면 반환되는 객체
이터레이터는 next 메서드를 갖습니다.
이터레이터의 next 메서드는 이터러블 각 요소를 순회하기 위한 포인터 역할을 해주는데요.
next 메서드를 호출하면 순차적으로 한 단계씩 순회하며 순회 결과를 나타내는 "이터레이터 Result 객체"를 반환합니다.
이터레이터 Result 객체는 value와 done 프로퍼티를 갖는 객체입니다.
const arr = [1, 2, 3];
const iterator = arr[Symbol.iterator]();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
등장 배경
ES6 이전의 순회 가능한 데이터 컬렉션 (배열, 문자열, 유사 배열 객체, DOM 컬렉션 등)
다들 제각각으로 순회할 수 있는 방법을 제시했습니다. (for 문, for ... in 문, forEach 메서드 등)
ES6부터는 이터러블을 만족하면, 해당 데이터 컬렉션은 (for ... of 문, 스프레드 문법, 배열 구조분해 할당) 등을 사용할 수 있도록 했습니다. 즉, 내부에 Symbol.iterator 메서드가 구현되어 있고, Symbol.iterator가 이터레이터를 반환한다면 어떤 데이터 컬렉션이든 이터러블이 되며, 위의 기능들을 사용할 수 있는 것입니다.
for ... of 문 내부 작동 원리
내부적으로 이터레이터의 next 메서드를 호출하여 이터러블을 순회합니다.
next 메서드가 반환한 이터레이터 리절트 객체의 value 프로퍼티 값을 for ... of 문의 변수에 할당합니다.
이터레이터 리절트 객체의 done 프로퍼티 값이 false이면 계속 순회, true이면 이터러블 순회를 중단합니다.
사용자 정의 이터러블 구현 (피보나치)
객체 내부에 Symbol.iterator 메소드를 구현하고, Symbol.iterator 메소드는 이터레이터를 반환해야 합니다.
이터레이터는 next 메소드를 가지고 있고, next 메소드는 이터레이터 Result 객체를 반환하도록 해줍니다.
const fibo = {
[Symbol.iterator]() {
let [pre, cur] = [0, 1];
const max = 10;
return {
next() {
[pre, cur] = [cur, pre + cur];
return { value: cur, done: cur >= max };
},
};
},
};
for (const v of fibo) {
console.log(v); // 1 2 3 5 8
}
참고
모던 자바스크립트 Deep Dive, Ch 34 이터러블
'JavaScript' 카테고리의 다른 글
[Javascript] 정규표현식을 이용한 다양한 패턴 예제 정리해보기 (1) | 2023.10.15 |
---|---|
[Javascript] 쓰로틀링(throttle), 디바운싱(debounce)을 헷갈리지 말자! (0) | 2023.03.15 |
[Javascript] 2차원 배열 만들기 + 2차원 배열 순회 (0) | 2022.10.15 |
[Javascript] 스코프 체인이란..? (0) | 2022.09.10 |
[Javascript] 함수 선언문과 함수 표현식 (0) | 2022.09.10 |