Javascript

[Javascript] iterable , iterator

임호랑이 2023. 8. 2. 10:20

이터러블이란

순회가능한 데이터를 말한다.
이터러블은 Symbol.iterator 를 프로퍼티 키로 사용한 메서드를 직접 구현하거나 프로토타입 체인을 통해 상속받은 객체이다. ( = 이터러블 프로토콜 )

ES6 이전의 순회 가능한 데이터 컬렉션들은 통일된 규약없이 각자 나름의 구조를 가지고 다양한방법으로 순회가 가능했다. ES6에서는 순회 가능한 데이터 컬렉션을 이터레이션 프로토콜을 준수하는 이터러블로 통일하였다

배열,문자열,Map,Set 등은 이터러블인데 콘솔로 찍어보면
프로토타입 체인을 통해 심볼.이터레이터 메서드를 상속 받고있다.

이터러블객체는 for..of문 뿐만아니라 스프레드 문법과 배열디스트럭처링 할당이 가능하다.

const array = [1,2,3];
// 배열은 Array.prototype의 Symbol.iterator 메서드를 상속받는 이터러블이다.
console.log(Symbol.iterator in array) // true

// 이터러블은 for..of 문 가능
for(const item of array) {
  console.log(item)
}
// 스프레드 문법도 가능
console.log([...array]) // [1,2,3]
// 배열 디스트럭처링 할당도 가능
const [a, ...rest] = array;
console.log(a, rest) // 1, [2,3]


일반객체는 심볼.이터레이터를 프로퍼티 키로 구현하거나, 프로토타입체인으로 상속받지않아서
for...of 나 디스트럭처링 할당을 할수 없다. 
단 TC39의 제안으로인해 스프레드문법 은 허용한다

 

더보기

TC39 란
TC39는 ECMAScript 내 위원회로써, ECMAScript 프로그래밍 언어를 발전시키고 사양을 작성하는 위원회입니다. 
각 위원회는 브라우저 벤더 및 회사들로 이루어져 있으며, 멤버는 각 회사에서 보낸 대표를 의미하는 것이기도 합니다. 
TC39는 합의(컨센서스)에 의해 이루어진다는 점이 특징인데, 
이는 결정권에 있어서 한명이라도 반대 의사가 있다면, 이에 대한 내용을 제고하는 방식을 사용합니다. 
또한, 이러한 제안은 실질적으로 기능을 구현하는 의무로 이어지는 점이 특징입니다.

 

 

이터레이터

이터러블객체 안의 Symbol.iterator  메서드를 호출하면 이터레이터를 반환한다.
반환된 이터레이터에는 요소를 순차적으로 한단계씩 순회하며 순회결과를 리턴하는 next() 라는 메서드를 갖게된다.
이터러블객체를 좀더 데이터 순화에 특화된 이터레이터라는것으로 진화 시키는 느낌이다.

// 배열은 이터러블
const array = [1,2,3]

// Symbol.iterator 메서드는 이터레이터를 반환한다.
const iterator = array[Symbol.iterator]();

// Symbol.iterator 메서드가 반환한 이터레이터는 next 메서드를 갖는다.
console.log('next' in iterator) // ture

'Javascript' 카테고리의 다른 글

[Javscript] Flux 패턴이란?  (0) 2023.11.10
[Javascript] Symbol  (0) 2023.08.01
[Javascript] Map 데이터타입  (0) 2023.08.01
[Javascript] 데이터타입  (0) 2023.07.14
[Javascript] 동작 엔진  (0) 2021.10.29