개요
- JavaScript Object는 왜 iterable이 아닌가?
- JavaScript 객체는 왜 iterable이 아닌가?
Object는 key-value 저장소 역할
- Object는 key-value 형식으로 데이터를 저장하는 일반적인 데이터 구조이다.
- Array나 Map처럼 순서가 중요한 데이터 구조가 아니라, key로 값을 조회하는 것이 주된 목적이다.
- 즉, Object는 순차적인 반복(iteration)을 염두에 둔 데이터 구조가 아니다.
JavaScript의 Iterable 프로토콜
- JavaScript에서 iterable이 되려면 Symbol.iterator 메서드를 구현해야 한다.
- Array, Map, Set 등은 Symbol.iterator를 내장하고 있어 for...of 루프에서 사용할 수 있지만, Object는 기본적으로 이를 구현하지 않는다.
대안
iteration 시키기
- 객체를 하고 싶다면 Object.keys(), Object.values(), Object.entries() 등을 사용하면 된다.
const obj = { a: 1, b: 2, c: 3 };
console.log(Object.keys(obj)); // ['a', 'b', 'c']
console.log(Object.values(obj)); // [1, 2, 3]
console.log(Object.entries(obj)); // [['a', 1], ['b', 2], ['c', 3]]
iterable 만들기
- Symbol.iterator를 직접 구현하면 객체도 iterable하게 만들 수 있다.
const obj = { a: 1, b: 2, c: 3 };
obj[Symbol.iterator] = function* () {
for (const key of Object.keys(this)) {
yield [key, this[key]];
}
};
for (const [key, value] of obj) {
console.log(key, value);
}