컬렉션
자료를 표현할 수 있는 객체 자료형의 하나로 Set
, Map
, WeakSet
, WeakMap
등이 있다. Weak
로 시작하는 자료형은 약한 참조를 사용하여 가비지 컬렉션을 통한 메모리 관리를 할 수 있다.
Set
const myset = new Set();
myset.add(1);
myset.add(1);
myset.add(2);
myset.add(3);
myset.add(4);
console.info(myset); // 1,2,3,4
Set
은 배열과 비슷하지만 순서를 보장하진 않고 중복없이 데이터를 나열할 수 있다.
Map
const mymap = new Map();
mymap.set("1", 1);
mymap.set(1, 2);
mymap.set(() => {}, 3);
mymap.set({}, 4);
console.info(mymap);
// 0 : {"1" => 1}
// 1 : {1 => 2}
// 2 : {() => {} => 3}
// 3 : {Object => 4}
// size : 4
Map
은 키-값 쌍으로 데이터를 저장할 수 있다. 언뜻보면 일반 객체와 차이가 없어 보이지만 크기를 확인할 수 있는 size 멤버를 제공한다. 기본적으로 반복 가능한 객체로 반복과 삽입 성능이 더 최적화 되어 있으며 순서를 보장한다. 또한 키를 객체, 함수, 숫자 등 다양한 자료형으로 설정할 수 있다.
제너레이터
어디서는 "발생기" 라고 굳이 번역하던데 북한도 아니고 그냥 제너레이터라고 하겠다.
JavaScript의 제너레이터는 함수 실행을 중단하고 다시 재개할 수 있는 특별한 함수다. function*
키워드를 사용해 정의하며 yield
문을 통해 중간 값을 반환한다. 제너레이터는 Iterable
객체를 반환하며 next()
메서드를 통해 실행을 제어할 수 있다. 일반 함수와는 다르게 한 번에 전체를 실행하지 않고 중단된 상태에서 필요한 부분만 실행할 수 있어 비동기 처리에 유용하다.
function* myGenerator() {
yield 1;
yield 2;
yield 3;
}
const gen = myGenerator();
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3
위 예시를 보면 next()
를 호출 하기 전까지는 제너레이터가 실행을 멈추고 대기한다. next()
를 호출하면 다시 실행되어 다음 yield
를 만날때까지 실행하고 반환하고 다시 대기한다.
function* infinite() {
let index = 0;
while (true) {
yield index++;
}
}
이 특성을 응용하면 무한 루프처럼 정지할 걱정 없이 무한한 데이터 구조를 정의할 수도 있다.