이터러블의 Symbol.iterator 메소드가 반환한 이터레이터는 next 메소드를 갖음
next 메소드 호출하면 이터러블을 순차적으로 한 단계씩 순회하며 순회 결과를 나타내는 이터레이터 리절트 객체를 반환
리절트 객체의
value 프로퍼티는 현재 순회 중인 이터러블의 값
done 프로퍼티는 이터러블의 순회 완료 여부를 나타냄
const array = [1, 2, 3];
const iterator = array[Symbol.iterator]();
console.log("next" in iterator); // true
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
for (변수 선언문 of 이터러블) {...}
내부적으로는 이터레이터의 next 메서드를 호출하여 이터러블을 순회하며 next 메서드가 반환한 이터레이터 객체의 done 프로퍼티 값을 확인하며 순회
false : 이터러블 순회를 계속 진행
true : 이터러블 순회를 중단함
for (const iter of [1,2,3]){
console.log(iter); // 1 2 3
}
// for문으로 구현한 for - of문
// 이터러블
const iterable = [1, 2, 3];
// 이터러블[Symbol.iterator] 메서드 호출 -> 이터레이터 생성
const iterator = iterable[Symbol.iterator]();
for (;;) {
const res = iterator.next();
if (res.done) break;
const item = res.value;
console.log(item); // 1 2 3
}