[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
섹션 1. 알아두어야 할 자바스크립트
Map
은 객체와 Set
은 배열과 비슷하다.
자바스크립트는 하나의 기능에 대해 자유도가 너무 높다. 그래서 사람마다 무궁무진하게 활용하다보니 다른 사람의 코드를 볼 때 이 객체를 어떤 목적으로 썼는지 분석하기엔 헷갈리는 경우가 발생하여 Map
은 객체와 Set
처럼 전문적인 객체를 만들었다.
Map
은 키와 값을 1:1로 매칭
const m = new Map(); // Map 생성
m.set('a', 'b'); // set(키, 값)으로 Map에 속성 추가
m.set('c', 'd');
m.get('a');
일반 객체는 키가 무조건 심볼(Symbol) 아니면 문자열(String)만 가능하지만 Map
은 키와 값을 객체로 할 수 있다.
m.set({a: 'b'}, {c: 'd'});
m.get({a: 'b'});
// set한 객체와 get한 객체의 참조값이 다름
{ a: 'b'} != { a: 'b'} // true
Map
에서 키를 객체로 사용하려면 변수에 미리 저장한 후 사용해야한다.
키를 객체로 쓸 수 있지만 같은 참조값을 가져야 같은 값이 나온다.
const obj = { key: 'key'}
m.set(obj, 123);
m.get(obj);
m.size
반복문을 돌릴 때 주로 for in
을 많이 사용했을 것이다.
이 때, 프로토타입에 있는 속성까지 나오버리므로 obj2.hasOwnProperty(i)
조건(보호장치)를 추가해주는 경우가 많았다.
const obj2 = {}
for (let i in obj2) {
if(obj2.hasOwnProperty(i)) {
obj2[i];
}
}
위의 코드를 개선할 수 있도록 나온 게 Map
이다.
for(const [k, v] of m) {
console.log(k, v);
} // 속성간의 순서도 보장된다.
m.forEach((v, k) => { // 배열이 아니지만 forEach도 사용 가능하다.
console.log(k, v);
});
속성 존재여부 확인
has(키)
로 속성 존재 여부를 확인한다.
m.has(obj);
m.has('z');
속성 삭제
delete(키)
로 속성을 삭제한다.
m.delete(obj);
속성 전부 제거
clear()
로 전부 제거
m.clear();
배열 대신 Set
을 쓰는 걸 추천하나 Set
은 배열을 완전히 대체하기 어렵다.
Set
은 중복을 허용하지 않는다.
(데이터 타입이 다르면 허용된다. ex) 1, '1')
const s = new Set();
s.add(1);
s.add(1);
s.add(2);
요즘에는 for in
문보다 for of
문을 많이 사용한다.
for (const a of s) {
console.log(a);
}
s.forEach((a) => {
console.log(a);
});
요소 삭제
delete(요소)
로 요소를 제거한다.
s.delete(2);
요소 전부 제거
clear()
로 요소를 전부 제거한다.
s.clear();
중복이 없어야하는 경우나 기존 배열에서 중복을 제거하고 싶을 때 사용하면 효율적이다.
const arr = [1, 2, 3, 2, 3, 5, 2]; // 2와 3 중복
const s2 = new Set(arr);
// Set이 아닌 배열(array)가 필요할 경우 형변환
Array.from(s2);
가비지 컬렉팅이 된다. 메모리에서 빠르게 정리가 된다.
const wm = new WeakMap();
let obj3 = {};
wm.set(obj3, '123');
obj3 = null;
// wm에 있는 123도 함께 삭제된다.
🥔💬
...?? 너 왜 살아있니??
아직 가비지컬렉팅이 안되어서 살아있나보다.
📑 출처
- [개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지 (인프런/조현영)