-
[함수형 프로그래밍] 잘 만들어진 이터레이터란? (well-formed iterator)JavaScript 2022. 2. 9. 15:27
사용자 정의 이터러블 만들기
const iterable = { [Symbol.iterator]() { let i = 3; return { next() { return i == 0 ? { done: true } : { value: i--, done: false }; }, }; }, }; console.log(iterable[Symbol.iterator]().next()); // 3 for (const a of iterable) console.log(a); // 3 2 1 순으로 순회가 가능합니다.
- iterable변수는 [Symbol.iterator]라는 키를 가지고 있으며 이를 실행했을 때 이터레이터를 반환합니다.
- 여기서 문제점은 iterable이 얼마나 순회하였는지를 기억하지 못한다는것입니다.
문제 해결하기
const iterable = { [Symbol.iterator]() { let i = 3; return { next() { return i == 0 ? { done: true } : { value: i--, done: false }; }, [Symbol.iterator]() { return this }, // well-formed iterable }; }, }; let iterator = iterable[Symbol.iterator](); console.log(iterator.next().value); // 3 for (const a of iterator) console.log(a); // 2 1
- [Symbol.iterator]를 실행했을 때 자기 자신을 반환한다면 이를 해결 할 수 있습니다.
this가 아닌 다른 값을 참조한다면?
const fakeIter = () => { return { next() { return { value: 1000, done: false }; }, }; }; const iterable = { [Symbol.iterator]() { let i = 3; return { next() { return i == 0 ? { done: true } : { value: i--, done: false }; }, [Symbol.iterator]() { return fakeIter(); }, }; }, }; let iterator = iterable[Symbol.iterator](); console.log(iterator.next()); // { value: 3, done: false } for (const a of iterator) console.log(a); // 1000이 무한반복됩니다.
for of 문을 순화하였을 때 1000이 무한히 나오는것을 확인할 수 있습니다.
정리
잘 만들어진 이터레이터란, 어디까지 순회를 하였는지 기억하고 있습니다.
이를 하기 위해서는 이터러블의 [Symbol.iterator]를 실행했을 때 이터레이터와 함께 [Symbol.iterator]를 반환해야하며, 이때 [Symbol.iterator]를 실행한다면 자기 자신을 반환해야합니다.
'JavaScript' 카테고리의 다른 글
[함수형 프로그래밍] reduce, go, pipe, curry 로 풀어보는 코딩테스트 (0) 2022.03.09 [함수형 프로그래밍] generator 알아보기 (0) 2022.02.22 [Javascript] 프로토타입으로 상속 구현하기 (0) 2022.02.19 [함수형 프로그래밍] 이터레이터와 이터러블이란? (0) 2022.01.31 [JavaScript] 25 Beginner JavaScript Project Ideas 첫번째 만들기 (0) 2022.01.25