*이터러블(iterable)
이란 자료를 반복할 수 있는 객체를 말한다. 우리가 흔히 쓰는 배열 역시 이터러블 객체이다.*
let arr = [1,2,3];
for(const a of arr) console.log (a) // 정상작동 1,2,3
arr[Symbol.iterator] = null; // 이렇게 하면 순회가 되지 않는다
for(const a of arr) console.log (a) // *Uncaught TypeError: arr is not iterable*
멀쩡한 배열임에 불구하고 for..of로 순회할수가 없게 되었다. [Symbol.iterable]
라는 코드가 눈에 띈다. 이제 저것이 무엇인지 알아보자.
배열처럼, 순회 가능한 자료 구조를 만들기 위하여 ECMAScript에서 정의한 규약이다.
ES6 이전에는 배열, 문자열, DOM Collection 등이 각자 방법으로 데이터를 순회할 수 있도록 구성되어 있었지만, ES6에 들어서면서 이러한 순회 가능한 데이터 들이 이터레이션 프로토콜을 준수하여 동일하게 동작하게끔 설계했다.
이러한 이터레이션 프로토콜에는 두가지가 있다.
어떠한 값들이 루프되는 것과 같은 이터레이션 동작을 정의하거나, 사용자 정의하는 것을 의미한다. 다시 말해, Symbol.iterator
를 호출하면 이터레이터를 반환하는 것을 이터러블 프로토콜 이라고 한다.
*이터레이터(iterator)
를 리턴하는 [Symbol.iterator]()
메서드를 가진 객체*
배열의 경우 Array.prototype 이 Symbol.iterator
를 상속받기 때문에 이터러블이다. 문자열도 마찬가지.
값들의 순서를 만드는 표준 방법을 의미한다. 객체가 next()
를 가지고 있고, 그 객체가 value
와 done
(true
, false
) 를 리턴한다면 이터레이터 프로토콜을 준수한 이터레이터다.
*{ value: 값, done: true/false }
형태의 객체를 리턴하고, next()
메서드를 가진 객체*