이 글은 정재남 개발자님의 인프런 강의인 JavaScript ES6+ 제대로 알아보기 중급편을 정리한 내용입니다.
iterable
은 내부 요소들을 공개적으로 반복할 수 있는 데이터 구조로서, __proto__
에 Symbol.iterator
메소드를 갖고 있다. Symbol.iterator
를 호출하면 iterator
를 반환하는데, next
메소드를 호출하면 value와 done의 객체를 뱉는다!!! iterable한 것들에는 array
, map
, set
, string
, generator
등이 해당하는데, object는 해당하지 않는다.
iterable
의 특징
const map = new Map([['a', 1], ['b', 2], ['c', 3]]);
console.log(Array.from(map));
// 0: ["a", 1]
// 1: ["b", 2]
// 2: ["c", 3]
const arrFromMap = [...map];
const [mapA, ,mapC] = map;
for(let x of [1, 2, 3]) {
console.log(x);
}
// 1
// 2
// 3
Promise.all
, Promise.race
명령을 수행할 수 있다const iterableVar = [
new Promise((resolve, reject) => { setTimeout(resolve, 5000, 10)}),
new Promise((resolve, reject) => { setTimeout(resolve, 3000, 20)}),
1004,
'가나다라',
new Promise((resolve, reject) => {setTimeout(resolve, 4000, 30)}),
];
Promise.all(iterableVar)
.then(value => console.log(v));
.catch(error => console.log(error));
// [10, 20, 1004, '가나다라', 30]
// Promise.all은 인자로 iterable을 받으며, 모든 결과가 다 나올 때 then 구문을 실행한다.
const arr = [1, 2, 3];
const makeGenerator = iterable => function* (){
yield* iterable;
// yield 1
// yield 2
// yield 3
}
const arrGen = makeGenerator(arr)();
iterator
는 반복을 위해 설계된 특별한 인터페이스를 가진 객체
이다.
iterator
의 객체 내부에는 next()
메소드가 존재.next()
메소드는 value
와 done
프로퍼티를 지닌 객체를 반환done
프로퍼티는 boolean
이다.아래는 iterator
형태의 예시이다.
const iterator = {
items: [1, 2, 3],
count: 0,
next() {
const done = this.count >= this.items.length;
return {
done,
value: !done? this.items[this.count++]: undefined
}
}
};
console.log(iter.next());
// {done: false, value: 1}
위와 같이 정의한 iterator
를 object에 [Symbol.iterator]
정의해 반환토록 하면 iterable
한 데이터 구조가 사용할 수 있는 해체 할당 등을 사용할 수도 있다. 아래에서 규칙에 맞게 iterator
를 구현해 보자. 규칙을 정리하면 다음과 같다.
const createIterator = function() {
let cnt = 0;
const items = Object.entries(this);
return {
next() {
return {
done: cnt >= items.length,
value: items[cnt++]
}
}
}
};
const obj = {
a: 1,
b: 2,
c: 3,
d: 4,
[Symbol.iterator]: createIterator
}
console.log(...obj);
// (2) ["a", 1] (2) ["b", 2] (2) ["c", 3] (2) ["d", 4]
덕 타이핑(duck typing)
이라 할 수 있다.