반복자는 반복 처리가 가능한 객체이며, next()를 호출해서 {valu:, done:} 두 개의 속성을 가지는 객체를 반환하는 객체입니다.
그리고 반복 가능한 객체를 Iterable이라고 부릅니다.
for...of 를 이용할 수 있거나 [Symbol.iterator] 이 값을 가지면 Iterable 한 것입니다.
function makeIterator(numbers){
let nextIndex = 0;
return {
next: function (){
return nextIndex < numbers.length ?
{value :numbers[nextIndex++], done: false} :
{value :undefined, done: true}
}
}
}
const numbersArray = [1,2,3]
const numbersIterator = makeIterator(numbersArray);
console.log(numbersIterator.next());//{value: 1, done: false}
console.log(numbersIterator.next());//{value: 2, done: false}
console.log(numbersIterator.next());//{value: 3, done: false}
console.log(numbersIterator.next());//{value: undefined, done: true}
배열 뒤에 Symbol.iterator 를 붙여주기만 하면 반복가능한 값을 반복기로 생성이 가능합니다.
const numbersArray = [1,2,3]
const numbersIterator = numbersArray[Symbol.iterator]();
console.log(numbersIterator.next());//{value: 1, done: false}
console.log(numbersIterator.next());//{value: 2, done: false}
console.log(numbersIterator.next());//{value: 3, done: false}
console.log(numbersIterator.next());//{value: undefined, done: true}
Iterable한 객체는 다양하게 존재합니다.
const set = new Set([1,2,3,4]);
const map = new Map([['a',1], ['b',2]]);
console.log(set[Symbol.iterator]()); //SetIterator {1, 2, 3, 4}
console.log(map[Symbol.iterator]()); //MapIterator {'a' => 1, 'b' => 2}