본문 바로가기

ECMAScript 2015, ECMAScript 6th Edition

3. iterable protocol

미리 설명하기에 앞서 +_+

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 as Array or Map, while other types (such as Object) are not.


PropertyValue
[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