본 글은 자바스크립트 스터디를 진행하면서 [모던자바스크립트 DeepDive] 책을 바탕으로 작성된 글입니다.
이터러블
이터러블이란 이터러블 프로토콜을 준수하는 객체다.
이터러블이면 for ~ of, spread operator, destructuring가 사용 가능하다.
📙 이터러블 프로토콜
Symbol.iterator를 프로퍼티 키로 사용한 메서드를 구현하거나 프로토타입 체인을 통해 상속받고,
그 함수를 호출하면 이터레이터 프로토콜에 준수한 이터레이터를 반환하는 것을 이터러블 프로토콜이라고 한다
📙 이터레이터 프로토콜
위에서 말한 반환한 이터레이터가 next()를 소유하며,
next()는 value와 done프로퍼티를 가지는 객체를 반환하는 것을 이터레이터 프로토콜이라고 한다
이 이터레이터는 요소를 탐색하기 위한 포인터 역할을 한다.
📌 Summary
- 이터러블은 이터러블 프로토콜을 준수하는 객체다.
- 이터러블 프로토콜을 준수하는 조건은 Symbol.iterator를 프로퍼티 키로 사용한 이터레이터 프로토콜을 준수하는 이터레이터를 반환하는 것이다
- 이터레이터 프로토콜을 준수하는 조건은 이터레이터가 next()를 반환하며, next()는 value와 done을 키로 가지는 객체를 반환하는 것이다
이터러블 예시
// 이터러블인 배열 선언
const array = [1, 2, 3];
// iterable
// 배열의 이터레이터(포인터)를 추출 ( 이터러블 프로토콜을 준수하기 때문에 이터레이터를 반환함 )
const iterator = array[Symbol.iterator]();
// 이터레이터 프로토콜을 준수하기 때문에 next()를 호출할 수 있으며, value와 done을 키로 가진 객체를 반환함
iterator.next(); // { value: 1, done: true }
iterator.next(); // { value: 2, done: true }
iterator.next(); // { value: 3, done: false }
이터러블이 아닌 예시
const person = { name: "john", age: 23 };
console.log(person[Symbol.iterator]); // undefined
// person is not iterable
for(let p of person){
console.log(p);
}
for ~ in과 for ~ of
for ~ of은 이터러블을 기준으로 돌아간다. ( next()를 사용함 )
for ~ in은 [[Enumeralbe]]값이 true인 것을 기준으로 돌아간다.
유사 배열과 이터러블
유사 배열과 이터러블은 비슷하지만 다르다.
유사 배열은 인덱스로 프로퍼티값에 접근이 가능하고 length를 가지는 것이 유사 배열이다
// 유사 배열
const arrayLike = {
0: "a",
1: "b",
2: "c",
length: 3,
}
console.log([...arrayLike]); // error
const array = Array.form(arrayLike);
console.log([...array]); // [a, b, c]
728x90
반응형
'JavaScript' 카테고리의 다른 글
[모던자바스크립트 DeepDive] 37장 Set과 Map (0) | 2023.02.12 |
---|---|
[모던자바스크립트 DeepDive] 35. 스프레드 문법 & 36. 디스트럭쳐링 할당 (0) | 2023.02.04 |
[모던자바스크립트-DeepDive]39장 DOM (1) | 2023.02.04 |
[javascript] 웹UI를 만들어보며 공부하는 자바스크립트 문법 (0) | 2022.05.21 |
[javascript]03_데이터타입 let vs var, hoisting (0) | 2022.01.07 |