ITERATOR PROTOCOL

Iterable과 for...of 계약

iterable/iterator는 단순 반복 문법이 아니라 Symbol.iterator가 iterator를 돌려주고, iterator.next()가 { value, done }을 반환하는 명시적 프로토콜이다.

01

iterator 요청

for...of가 객체의 [Symbol.iterator]()를 호출한다.

protocol start
02

next 호출

반복마다 iterator.next()를 호출해 value와 done을 읽는다.

{value, done}
03

값 사용

done이 false면 value를 루프 변수에 넣고 본문을 실행한다.

yielded value
04

종료 처리

done이 true이거나 break가 발생하면 반복을 끝내고 return이 있으면 정리한다.

early close
Array
기본 iterable values iterator를 제공해 for...of, spread, destructuring이 동작한다.
built-in
Custom iterable
직접 Symbol.iterator 구현 데이터 구조의 순회 순서를 외부에 노출할 수 있다.
계약
Generator
yield로 next 상태 저장 복잡한 iterator 상태 기계를 yield 흐름으로 단계별로 작성한다.
function*
Iterator only
iterable과 iterator를 겸할 수도 있음 자기 자신을 반환하는 Symbol.iterator를 두면 한 번 소비되는 반복자가 된다.
single-use caution

오류 포인트

done 누락 next가 done:true를 반환하지 않으면 무한 반복이 된다.
value 형태 구조분해를 쓸 경우 value가 기대한 배열/객체 형태인지 확인한다.
조기 종료 파일/네트워크 자원 반복자는 break 시 정리 로직을 제공해야 한다.