728x90
반복 프로토콜(Iteration protocol)
const obj = {
[Symbol.iterator]() {
let i = 3;
return {
next() {
return {value: --i, done: i < 0};
}
}
}
}
// 지연 순회를 할 수 없다.
for (const a of obj) {
console.log(a);
}
Iteration protocol(이하 반복 프로토콜)은 1개 이상의 데이터를 가질 수 있는 객체의 내부 순회를 추상화하기 위한 규약(protocol)으로 다음과 같은 형태로 구현된다.
객체가 Symbol.iterator에 { value, done }를 리턴하는 next() 메소드를 가지는 것을 규칙으로 하며, 이를 구현한 객체를 iterable 객체라고 표현한다. 반환되는 객체는 Sequence를 가질 value와, 순회 종료를 나타내는 done 프로퍼티로 구성되고 done이 false인 경우 순회가 종료된다.
하지만 이렇게 구현한 이터레이터는 이터레이터의 장점인 지연 순회를 하지 못하는데 이는 반환된 객체는 반복 프로토콜을 지키고 있지 않기 때문에 잘 정의되지 못한 iterables이다. 따라서 다음과 같이 수정하면 지연 순회가 가능한 Iterator가 된다.
well-formed iterable
const obj = {
[Symbol.iterator]() {
let i = 3;
return {
next() {
return {value: --i, done: i < 0};
},
[Symbol.iterator]() { return this; } // 반환된 객체도 반복 프로토콜을 준수
}
}
}
const iter = obj[Symbol.iterator]();
iter.next();
for (const a of iter) {
console.log(a);
}
기존 인덱스 기반 접근 방식의 순회보다 깔끔하고 i++같은 순회할 인덱스 상태를 관리하지 않아도 되기 때문에 우아한 코드라고 할 수 있다.
참고자료
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Iteration_protocols
https://gist.github.com/qodot/ecf8d90ce291196817f8cf6117036997
'메모' 카테고리의 다른 글
Node.js 플랫폼 (0) | 2022.02.04 |
---|---|
Type<Challenge[]> #Easy (0) | 2022.02.04 |
Typescript로 구현한 Linked list (0) | 2022.02.01 |
JS의 메모리관리 (0) | 2022.01.13 |
Generator (0) | 2022.01.01 |