웹
[javascript] iterable 객체
meno1011
2023. 5. 31. 13:53
728x90
반복가능한( iterable, 이터러블) 객체는 배열을 일반화한 객체이다. 이터러블이라는 개념을 사용하는 어떤 객체는 for ... of 반복문을 적용할 수 있다.
배열은 대표적인 이터러블이다. 배열 외에도 다수의 내장 객체가 반복 가능하다.
문자열 역시 이터러블의 예이다.
아래 예시로 range라는 객체를 이터러블로 만들어 배열화 해보면
Symbol.iterator
반복 대상의 객체( range )와 이터레이터 객체( range[Symbol.iterator] )를 분리하여 관리
let range = {
from: 1,
to: 5,
};
// 1. for..of 최초 호출 시, Symbol.iterator가 호출됩니다.
range[Symbol.iterator] = function () {
// Symbol.iterator는 이터레이터 객체를 반환합니다.
// 2. 이후 for..of는 반환된 이터레이터 객체만을 대상으로 동작하는데, 이때 다음 값도 정해집니다.
return {
current: this.from,
last: this.to,
// 3. for..of 반복문에 의해 반복마다 next()가 호출됩니다.
next() {
// 4. next()는 값을 객체 {done:.., value :...}형태로 반환해야 합니다.
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
},
};
};
// 이제 의도한 대로 동작합니다!
for (let num of range) {
console.log(num); // 1, 2, 3, 4, 5
}
반복 대상의 객체 ( range ) 자체를 이터레이터로 만드는 경우 코드가 더 간단해진다.
let range = {
from: 1,
to: 5,
[Symbol.iterator]() {
this.current = this.from;
return this;
},
next() {
if (this.current <= this.to) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
},
};
for (let num of range) {
console.log(num); // 1, 2, 3, 4, 5
}
추가로 문자열은 iterable이다.
for(let char of 'hello'){
console.log(char); // h, e, l, l, o가 순서대로 출력됩니다.
}