Iterator와 Generator
Iterables
객체가 Symbol.iterator
프로퍼티에 대한 구현을 가지고 있다면 Iterable로 간주됩니다. Array
, Map
, Set
, String
, Int32Array
, Uint32Array
등과 같은 몇몇 내장 타입은 이미 구현된 Symbol.iterator
프로퍼티를 가지고 있습니다. 객체의 Symbol.iterator
함수는 반복할 값 목록을 반환합니다.
for..of
명령문
for..of
는 Iterable 객체를 반복하며, 객체의 Symbol.iterator
프로퍼티를 호출합니다. 다음은 배열에서 간단한 for..of
루프입니다.
|
|
for..of
vs. for..in
명령문
for..of
와 for..in
명령문 모두 리스트를 반복합니다. 반복되는 값은 다르지만 for..in
은 반복되는 객체의 key
목록을 반환합니다. 반면 for..of
는 반복되는 객체의 숫자 프로퍼티 값 목록을 반환합니다.
다음 코드는 이 차이를 보여줍니다.
|
|
또 다른 차이점은 for..in
은 어떤 객체에서도 작동한다는 것입니다. 그리고 객체의 프로퍼티를 검사하는 방법으로 사용됩니다. for..of
는 주로 반복 가능한 객체의 값에 관심이 있습니다. Map
과 Set
같은 내장 객체는 저장된 값에 접근할 수있는 Symbol.iterator
속성이 있습니다.
|
|
Code generation
ES5와 ES3 타겟팅
ES5 나 ES3를 대상으로 할 때, Iterator는 Array
타입의 값에만 허용됩니다. 이러한 배열이 아닌 객체에 Symbol.iterator
프로퍼티를 구현하는 경우에도, for..of
루프를 사용하는 것은 오류 입니다.
컴파일러는 for..of
루프를 위한 간단한 for
루프를 생성합니다, 예를 들면 :
|
|
다음과 같이 생성됩니다.
|
|
ECMAScript 2015 이상 타겟팅
ECMAScipt 2015 호환 엔진을 대상으로 할 때, 컴파일러는 엔진에 내장된 Iterator 구현을 타겟으로하는 for..of
루프를 생성할 것입니다.
이 내용은 나중에 참고하기 위해 제가 공부하며 정리한 내용입니다.
의역, 오역, 직역이 있을 수 있음을 알려드립니다.
This post is a translation of this original article [https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html]
참고
- TypeScript 핸드북 1 - 기본 타입
- TypeScript 핸드북 2 - 변수 선언
- TypeScript 핸드북 3 - 인터페이스
- TypeScript 핸드북 4 - 클래스
- TypeScript 핸드북 5 - 함수
- TypeScript 핸드북 6 - Generic
- TypeScript 핸드북 7 - Enum
- TypeScript 핸드북 8 - 타입 유추
- TypeScript 핸드북 9 - 타입 호환성
- TypeScript 핸드북 10 - 고급 타입
- TypeScript 핸드북 11 - Symbol
- TypeScript 핸드북 12 - Iterator와 Generator