34.1 반복 프로토콜
ES6에 도입된 반복 프로토콜은 반복 가능한 데이터 모음(데이터 구조)을 생성하기 위해 ECMAScript 사양에 정의된 미리 커밋된 규칙입니다.
ES6에서 반복 가능한 데이터 컬렉션은 반복 프로토콜을 준수하는 반복 가능한 엔티티로 통합되어 for…of 문, 확산 구문 및 배열 구조 분해 할당의 대상으로 사용할 수 있습니다.
반복 가능한 프로토콜_반복 가능한 프로토콜
잘 알려진 심볼인 Symbol.iterator를 속성 키로 사용하는 메서드를 직접 구현하거나 프로토타입 체인을 통해 상속된 Symbol.iterator 메서드를 호출하면 반복자 프로토콜을 준수하는 반복자를 반환합니다.
이 히스토리를 iterable history라고 하고, iterable history에 해당하는 객체를 iterable이라고 합니다.
Iterables는 for…of 문으로 반복할 수 있으며 확산 구문 및 배열 구조 분해 할당의 대상으로 사용할 수 있습니다.
반복자 로그
Iterable의 Symbol.iterator 메서드를 호출하면 반복자 프로토콜을 준수하는 반복자를 반환합니다.
반복자에는 다음 메서드가 있으며 다음 메서드를 호출하면 Iterable을 반복하고 value 및 done 속성이 있는 Iterator 결과 객체를 반환합니다.
이 규칙을 반복자 프로토콜이라고 하며 반복자 프로토콜을 준수하는 객체를 반복자라고 합니다.
Iterator는 iterable의 요소를 반복하는 포인터 역할을 합니다.
34.1.1 이터러블
iterable은 Symbol.iterator를 속성 키로 사용하거나 프로토타입 체인을 통해 상속하여 메서드를 직접 구현하는 객체입니다.
34.1.2 반복자
iterator의 next 메서드는 iterable의 각 요소를 반복하기 위한 포인터 역할을 합니다.
즉, next 메서드를 호출하면 한 번에 하나씩 iterable을 반복하고 반복 결과를 나타내는 iterator 결과 객체를 반환합니다.
34.2 내장 iterables
34.3 for…of 문
for…in 문은 객체의 프로토타입 체인에 있는 프로토타입의 모든 속성 중에서 속성 속성((Enumerable))이 참인 속성을 반복하고 열거합니다.
현재 속성 키가 기호인 속성은 나열되지 않습니다.
for…of 문은 반복자의 next 메서드를 내부적으로 호출하여 iterable을 반복하고 next 메서드에서 반환된 반복자 결과 객체의 value 속성을 for.. .of 문의 변수에 할당합니다.
반복자 결과 객체의 done 속성 값이 false이면 iterable은 반복을 계속하고 true이면 iterable은 반복을 중지합니다.
34.4 이터러블과 유사 배열 객체
배열과 같은 객체는 길이 속성을 가지고 있기 때문에 for 문으로 반복할 수 있고 속성 키로 인덱스를 나타내는 숫자 문자열을 가지고 있기 때문에 속성 값은 배열처럼 인덱스로 접근할 수 있습니다.
그러나 배열과 같은 객체는 이터러블이 아닌 일반 객체입니다.
따라서 배열과 같은 객체에는 Symbol.iterator 메서드가 없으므로 for…of 문으로 반복할 수 없습니다.
단계, 인수, NodeList 및 HTMLCollection은 배열과 유사한 객체 및 반복 가능 항목입니다.
보다 구체적으로 ES6에 Iterables가 도입되면서 유사한 Array 객체인 Arguments, NodeList 및 HTMLCollection 객체에 Symbol.iterator 메서드를 구현하여 Iterables가 되었습니다.
그러나 반복 가능하게 된 후에도 길이 속성이 있고 인덱스로 액세스할 수 있으므로 유사 배열 객체이며 반복 가능합니다.
위 예제의 arrayLike 객체는 배열과 유사한 객체이지만 반복 가능한 객체는 아닙니다.
그러나 ES6에 도입된 Array.from 메서드를 사용하면 쉽게 배열로 변환할 수 있습니다.
Array.from 메서드는 배열과 같은 객체 또는 반복 가능 항목을 인수로 사용합니다.
배열로 전달되고 배열로 변환되어 반환됩니다.
34.5 반복 프로토콜의 필요성
for…of 문, 확산 구문, 배열 구조 분해 할당 등 Array, String, Map, Set, TypedArray(Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array), DOM Collection( NodeList, HTMLCollection 등 다양한 데이터 소스 및 인수를 사용할 수 있습니다.
아시다시피 위의 데이터 소스는 모두 반복 프로토콜을 준수하는 반복 가능합니다.
iterables는 다음과 같은 데이터 소비자가 사용하기 때문입니다.
예를 들어 for…of 문, 확산 구문 및 배열 구조 분해 할당은 데이터 공급자 역할을 한다고 할 수 있습니다.
반복 프로토콜은 데이터 소비자와 데이터 공급자를 연결하는 인터페이스 역할을 하여 데이터 소비자가 서로 다른 데이터 공급자가 순회 방법을 갖도록 지정하여 서로 다른 데이터 공급자를 효율적으로 사용할 수 있도록 합니다.
배열, 문자열 등은 모든 데이터를 메모리에 미리 저장한 후 데이터를 전달합니다.
Iterables는 지연 평가를 통해 데이터를 생성합니다.
게으른 평가는 데이터가 필요할 때만 미리 데이터를 생성하고, 데이터가 필요할 때만 데이터를 생성하는 기법이다.
즉, 지연 채점은 채점 결과가 필요할 때까지 채점을 지연시키는 기술입니다.
게으른 평가는 불필요한 데이터를 미리 생성하지 않고 필요한 순간에 필요한 데이터를 생성하는 장점이 있어 빠른 실행 속도를 기대할 수 있고 불필요한 메모리를 소모하며 무한히 표현할 수 있다.
– 알라딘 eBook에서