이터레이션의 프로토콜을 준수하지 않은 일반 객체도 이터레이션 프로토콜을 준수하도록 구현하면 사용자 정의 이터러블이 된다.
먼저 이터레이션에 대해 한번 더 복습해보자.
- 이터레이션 : 이터러블의 Symbol.iterator 메서드를 호출하면 반환되는 것.
- 이터레이션은 next 메서드를 갖는다.
- next 메서드는 각 요소를 순회하기 위한 포인터 역할을 하며, value 프로퍼티와 done 프로퍼티를 갖는 이터레이터 리절트 객체를 반환한다.
const fibonacci = {
[Symbol.iterator]() {
let [pre, cur] = [0, 1];
const max = 20;
return {
next() {
[pre, cur] = [cur, pre + cur];
return {value: cur, done: cur >= max}
}
};
}
};
for (const num of fibonacci) {
console.log(num);
}
위는 사용자 정의 이터러블으로써,
일반 객체에 이터레이터 프로토콜을 준수하게 코딩하였다.
위의 코드로 피보나치 수열을 구현하였다.
- 먼저, 일반 객체에 [Symbol.iterator] 메서드를 구현했다.
- Symbol.iterator 메서드는 next 메서드를 반환(return)한다.
- next 메서드는 이터레이터 리절트 객체(value, done으로 구성됨)를 반환한다.
- for of문을 사용하면 done이 true가 될 때까지 반복하며, true가 되면 반복을 중지한다.
const fibonacci = {
[Symbol.iterator]() {
let [pre, cur] = [0, 1];
const max = 20;
return {
next() {
[pre, cur] = [cur, pre + cur];
return {value: cur, done: cur >= max}
}
};
}
};
const arr = [...fibonacci];
console.log(arr);
const [first, second, ...rest] = fibonacci;
console.log(first, second, rest);
또한 for.... of 문 뿐만 아니라
스프레드 문법, 디스트럭쳐링 할당에도 사용할 수 있다.
'Javascript' 카테고리의 다른 글
(JS) 제너레이터의 활용 (0) | 2022.06.13 |
---|---|
(JS) 제너레이터 (0) | 2022.06.13 |
(JS) 이터레이터 (0) | 2022.06.11 |
(JS) 이터러블 (아직 직관적인 이해가 안감) (0) | 2022.06.11 |
(JS) 프로미스(Promise) (0) | 2022.06.10 |