반복 가능한(iterable, 이터러블)
객체는 배열을 일반화한 객체입니다. 이터러블 이라는 개념을 사용하면 어떤 객체에든 for..of
반복문을 사용할 수 있습니다.
배열은 대표적인 이터러블입니다. 배열 외에도 다수의 내장 객체가 반복 가능하다고 합니다. 문자열 역시 이터러블의 예 입니다.
그러면 for..of
반복문을 사용할 수 있으면 iterable객체
라는 것 인데 어떤 조건이 있어야 사용이 가능한것일까요?
for..of
반복문을 사용할 수 있으려면 객체에 Symbol.iterator
메서드가 있어야 한다고 합니다.
for..of
는 다음과 같은 과정을 통해 이뤄지기때문에 Symbol.iterator
메서드가 필요합니다.
for..of
가 시작되자마자Symbol.iterator
를 호출합니다.Symbol.iterator
는 이터레이터(next메서드가 있는 객체
)를 반환해야 합니다.- 이후
for..of
는 이터레이터만을 대상으로 동작합니다.- 다음 값이 필요하면 이터레이터의
next()
메서드를 호출합니다.next()
의 반환값은{ done: Boolean, value: any }
와 같은 형태이고,done: true
는 반복이 종료되었음을 의미하고 false이면value
에 다음 값이 저장됩니다.
이를 통해 우리는 어떤 배열이 아닌 객체가 있는데, 이 객체가 어떤 것들의 컬렉션을 나타내고 있는 경우, for..of
문법을 적용할 수 만 있다면 순회하는데 유용할 겁니다. 이럴때 직접 해당 객체에 Symbol.iterator
메서드를 생성해줘서 순회가 가능하도록 만들 수 있습니다.
비슷해 보이지만 아주 다른 용어 두 가지가 있습니다.
Symbol.iterator
메서드가 구현된 객체입니다.length
프로퍼티가 있어서 배열처럼 보이는 객체 입니다.이터러블과 유사 배열은 대개 배열이 아니기때문에 push
, pop
등의 메서드를 지원하지 않는다고 합니다. 그렇지만 배열이 아닌 객체들을 배열로 만들어주는 Array.from()
메서드가 존재하기때문에 이를 사용하면 배열로 만들 수 있습니다.