미리 설명하기에 앞서 +_+
Symbol 과 Destructuring 은 다음에 다루도록 하겠다.
아래 나오는 것중 Symbol.iterator 에서의 Symbol은 뭐지?? 라는 생각은 하지 말아주시길... ㅋ
그리고 Destructuring 은 간단하게만 설명하면
let [a, b] = [1,2] console.log(a); //1 이 출력됌 console.log(b); //2 가 출력됌
자 그럼 이제 설명 시작!!
iterable protocol 이란?
The iterable protocol allows JavaScript objects to define or customize their iteration behavior, such as what values are looped over in a
for..of
construct. Some built-in types are built-in iterables with a default iteration behavior, such asArray
orMap
, while other types (such asObject
) are not.
Property | Value |
---|---|
[Symbol.iterator] | A zero arguments function that returns an object, conforming to theiterator protocol. |
출처 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
이터러블 프로토콜이 설정된 오브젝트를 의미
즉, object의 반복 동작을 정의한 object 는 iterable object 가 될 수 있다.
let fibonacci = { [Symbol.iterator]() { let pre = 0, cur = 1; return { next() { [pre, cur] = [cur, pre + cur]; return { done: false, value: cur } } } } } for (var n of fibonacci) { // truncate the sequence at 1000 if (n > 1000) break; console.log(n); }
TypeScript 의 type syntax 를 이용하여 표현하면 아래와 같다.
using TypeScript type syntax for exposition only :
interface IteratorResult { done: boolean; value: any; } interface Iterator { next(): IteratorResult; } interface Iterable { [Symbol.iterator](): Iterator }
프로토콜 규약이므로 개발자 코드로 이터러블 프로토콜 정의가 가능하고,
이는 곧 iterable object 는 duck-typed interfaces 와 같다는 것을 알 수있다.
이터레이터 프로토콜은
- 오브젝트의 값을 순서로 처리할 수 있는 방법
- 이 방법은 오브젝트에 있는 next() 로 구현되어진다!
- 따라서 next() 가 오브젝트에 있으면 이터레이터 프로토콜이 적용되었다고 볼수 있다!!
- 위에서 설명했듯이 한번더 설명하면 object 에 Symbol.Iterator 에서 object 를 반환하고
- next 함수가 정의되어 있으면 Iterable object 라고 볼 수 있으며,
- 뒤에서 설명할 for-of 문법을 사용이 가능한 것이다! ( 이것이 바로 duck-typed )
빌트인(built-in object) 중 iterable object 인것
- String, Array, TypedArray, Map, Set
- function 의 arguments, DOM NodeList
이터러블 오브젝트 조건
- Symbol.iterator() 가 존재
- 빌트인 이러터블 오브젝트에는 디폴트로 설정됨
- 상속받은 prototype chain 에 있어도 됨
- 즉, Array 를 상속받으면 이터러블 오브젝트가 됨
make iterable object sample
let fibonacci = { [Symbol.iterator]() { let pre = 0, cur = 1 return { next () { [ pre, cur ] = [ cur, pre + cur ] return { done: false, value: cur } } } } } for (let n of fibonacci) { if (n > 1000) break console.log(n) }
'ECMAScript 2015, ECMAScript 6th Edition' 카테고리의 다른 글
6. Array-like (0) | 2016.09.07 |
---|---|
5. rest (0) | 2016.09.07 |
4. spread (0) | 2016.09.06 |
2. arrow (0) | 2016.09.04 |
1. let, const (0) | 2016.09.04 |