컬렉션의 각 항목을 처리하는 것은 매우 일반적인 작업입니다. JavaScript는 간단한 for 및 foreach 루프부터 map(), filter() 및 배열 이해에 이르기까지 컬렉션을 반복하는 다양한 방법을 제공합니다. JavaScript 1.7에서 반복자와 생성기는 핵심 JavaScript 구문에 새로운 반복 메커니즘을 제공하고 for...in 및 foreach 루프의 동작을 사용자 정의하는 메커니즘도 제공합니다.
반복자
반복자는 컬렉션 시퀀스에서 한 번에 하나의 요소에 액세스하고 시퀀스에서 반복의 현재 위치를 추적하는 객체입니다. JavaScript에서 반복자는 시퀀스의 다음 요소를 반환하는 next() 메서드를 제공하는 개체입니다. 이 메서드는 시퀀스의 모든 요소가 순회되면 StopIteration 예외를 발생시킵니다.
반복자 객체가 생성되면 next()를 반복적으로 호출하거나 JavaScript의 for...in 및 foreach 루프를 암시적으로 사용하여 명시적으로 호출할 수 있습니다.
객체와 배열을 반복하기 위한 간단한 반복자는 Iterator()를 사용하여 만들 수 있습니다.
초기화가 완료되면 next() 메서드를 호출하여 객체의 키-값 쌍에 순차적으로 액세스할 수 있습니다.
next() 메서드를 명시적으로 호출하는 대신 for…in 루프를 사용할 수 있습니다. StopIteration 예외가 발생하면 루프가 자동으로 종료됩니다.
객체의 키 값만 반복하려는 경우 true 값을 사용하여 두 번째 매개변수를 Iterator() 함수에 전달할 수 있습니다.
Iterator()를 사용하여 객체에 액세스할 때의 한 가지 이점은 Object.prototype에 추가된 사용자 정의 속성이 시퀀스 객체에 포함되지 않는다는 것입니다.
Iterator()는 배열에서도 사용할 수 있습니다.
객체를 순회하는 것과 마찬가지로 두 번째 매개변수로 true를 전달하면 순회가 배열 인덱스가 됩니다.
let 키워드를 사용하여 루프 내부의 블록 변수에 인덱스와 값을 할당하고 구조 분해 할당을 사용할 수도 있습니다.
맞춤 반복자 선언
요소 모음을 나타내는 일부 개체는 지정된 방식으로 반복되어야 합니다.
1. 범위를 나타내는 객체를 반복하면 범위에 포함된 숫자가 하나씩 반환되어야 합니다.
2. 트리의 리프 노드는 깊이 우선 또는 너비 우선을 사용하여 액세스할 수 있습니다
3. 전체 결과 세트가 아직 단일 배열에 로드되지 않은 경우에도 데이터베이스 쿼리 결과를 나타내는 객체에 대한 반복은 행별로 반환되어야 합니다.
4. 무한 수학적 수열(예: 피보나치 수열)에서 작동하는 반복자는 무한 길이의 데이터 구조를 생성하지 않고 결과를 차례로 반환해야 합니다
JavaScript를 사용하면 사용자 정의 반복 논리를 작성하고 이를 객체에 적용할 수 있습니다
낮은 값과 높은 값을 포함하는 간단한 Range 개체를 만듭니다.
이제 범위의 모든 정수를 포함하는 시퀀스를 반환하는 사용자 정의 반복자를 만듭니다. 반복자 인터페이스에서는 시퀀스의 다음 요소를 반환하거나 StopIteration 예외를 발생시키기 위해 next() 메서드를 제공해야 합니다.
RangeIterator는 범위 인스턴스로 인스턴스화되며 현재 시퀀스 위치를 추적하기 위해 현재 속성을 유지합니다.
마지막으로 RangeIterator를 Range와 결합하려면 Range에 대한 특별한 __iterator__ 메서드를 추가해야 합니다. Range를 반복하려고 할 때 호출되며 반복 논리를 구현하는 RangeIterator 인스턴스를 반환해야 합니다.
사용자 정의 반복자를 완성하고 나면 범위 인스턴스를 반복할 수 있습니다.
Generator: 반복자를 구축하는 더 좋은 방법
사용자 정의 반복자는 유용한 도구이지만 내부 상태를 명시적으로 유지해야 하므로 생성할 때 신중한 계획이 필요합니다.
생성기는 매우 강력한 기능을 제공합니다. 이를 통해 자체 반복 알고리즘이 포함된 함수를 정의할 수 있으며 자체 상태를 자동으로 유지할 수 있습니다.
생성기는 반복기 팩토리 역할을 할 수 있는 특수 함수입니다. 함수에 하나 이상의 항복 표현식이 포함된 경우 이를 생성기라고 합니다(번역자 참고 사항: Node.js에서는 이를 나타내기 위해 함수 이름 앞에 *를 추가해야 함).
참고: HTML의