#JavaScript
JavaScript의 Iteration Protocol
JavaScript의 통일된 순회 가능한 데이터
· 1 MIN · 196 WORDS
Iteration Protocol
- ES6에 등장한 순회 가능한 데이터 컬렉션을 만드는 규칙
- Iterable Protocol과 Iterator Protocol이 있음
- ES6 이전의 배열, 문자열, 유사 배열 객체 (Array-like Object), DOM 컬렉션 등을 통합하는 규칙
- ES6의 순회 가능한 데이터 컬렉션은
for ... of, spread, destructuring 할당의 대상이 될 수 있음const iterable = [1, 2, 3, 4, 5]; for n of iterable { console.log(n); } const new_iterable = [0, ...iterable]; const [n, ...others] = iterable;
Iterable Protocol
Symbol.iterator을 프로퍼티 키로 갖는 메서드가 존재하는 객체- 해당 메서드는 iterator protocol을 준수하는 객체를 반환해야 한다!
Iterator Protocol
{ value, done }를 반환하는next메서드를 가짐value는 순회 중인 이터러블의 값done은 이터러블의 순회 완료 여부를 나타내는 값
빌드인 이터러블
Array,String,Map,Set,TypedArray,arguments, DOM 컬렉션은 모두 이터러블for ... of, spread, destructuring 할당 가능하다!
유사 배열 객체
- 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고
length프로퍼티를 갖는 객체 Symbol.iterable메서드가 없다면for ... of로 접근 불가능Array.from을 통해 이터러블 객체로 변환 가능
지연 평가
- 데이터가 필요한 시점 이전까지는 데이터를 생성하지 않다가 필요한 시점에 생성하는 기법
- 이터러블을 소비하는 대부분의 방법은
next가 평가되기 전까지는 데이터를 생성하지 않는 지연 평가 사용for ... of, destructuring 할당 등
커스텀 이터러블 구현
const fibonacci = {
[Symbol.iterator]: () => {
let [pre, cur] = [0, 1];
return {
next: () => {
[pre, cur] = [cur, pre + cur];
return {
value: cur,
done: false,
};
},
};
},
};
const [n1, n2, n3] = fibonacci;
console.log(n1, n2, n3); // 1 2 3