TypeScript 핸드북 12 - Iterator와 Generator

Iterator와 Generator

Iterables

객체가 Symbol.iterator 프로퍼티에 대한 구현을 가지고 있다면 Iterable로 간주됩니다. Array, Map, Set, String, Int32Array, Uint32Array 등과 같은 몇몇 내장 타입은 이미 구현된 Symbol.iterator 프로퍼티를 가지고 있습니다. 객체의 Symbol.iterator 함수는 반복할 값 목록을 반환합니다.

for..of 명령문

for..ofIterable 객체를 반복하며, 객체의 Symbol.iterator 프로퍼티를 호출합니다. 다음은 배열에서 간단한 for..of 루프입니다.

1
2
3
4
5
let someArray = [1, "string", false];
for (let entry of someArray) {
console.log(entry); // 1, "string", false
}

for..of vs. for..in 명령문

for..offor..in 명령문 모두 리스트를 반복합니다. 반복되는 값은 다르지만 for..in은 반복되는 객체의 key 목록을 반환합니다. 반면 for..of는 반복되는 객체의 숫자 프로퍼티 값 목록을 반환합니다.

다음 코드는 이 차이를 보여줍니다.

1
2
3
4
5
6
7
8
9
let list = [4, 5, 6];
for (let i in list) {
console.log(i); // "0", "1", "2",
}
for (let i of list) {
console.log(i); // "4", "5", "6"
}

또 다른 차이점은 for..in은 어떤 객체에서도 작동한다는 것입니다. 그리고 객체의 프로퍼티를 검사하는 방법으로 사용됩니다. for..of는 주로 반복 가능한 객체의 값에 관심이 있습니다. MapSet 같은 내장 객체는 저장된 값에 접근할 수있는 Symbol.iterator 속성이 있습니다.

1
2
3
4
5
6
7
8
9
10
let pets = new Set(["Cat", "Dog", "Hamster"]);
pets["species"] = "mammals";
for (let pet in pets) {
console.log(pet); // "species"
}
for (let pet of pets) {
console.log(pet); // "Cat", "Dog", "Hamster"
}

Code generation

ES5와 ES3 타겟팅

ES5 나 ES3를 대상으로 할 때, IteratorArray 타입의 값에만 허용됩니다. 이러한 배열이 아닌 객체에 Symbol.iterator 프로퍼티를 구현하는 경우에도, for..of 루프를 사용하는 것은 오류 입니다.

컴파일러는 for..of 루프를 위한 간단한 for 루프를 생성합니다, 예를 들면 :

1
2
3
4
let numbers = [1, 2, 3];
for (let num of numbers) {
console.log(num);
}

다음과 같이 생성됩니다.

1
2
3
4
5
var numbers = [1, 2, 3];
for (var _i = 0; _i < numbers.length; _i++) {
var num = numbers[_i];
console.log(num);
}

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]

참고

공유하기