[javascript] Map
Map
ES6 이전에 키와 값을 연결하려면 객체를 사용해야 했다. 하지만 객체를 이런 목적으로 사용하면 여러 가지 단점이 생긴다.
- 프로토타입 체인 때문에 의도치 않은 연결이 생길 수 있다.
- 객체 안에 연결된 키와 값이 몇 개나 되는지 쉽게 알아낼 수 있는 방법이 없다.
- 키는 반드시 문자열이나 심볼이여야 하므로 객체를 키로 서서 값과 연결할 수 없다.
- 객체는 프로퍼티 순서를 전혀 보장하지 않는다.
Map 객체는 이 단점을 모두 해결했고, 키와 값을 연결할 목적이라면 객체보다 나은 선택이다.
const u1 = { name: '김씨'};
const u2 = { name: '박씨'};
const u3 = { name: '이씨'};
const u4 = { name: '최씨'};
맵을 만든다.
const userRoles = new Map();
userRoles.set(u1, 'User');
userRoles.set(u2, 'User');
userRoles.set(u3, 'Admin');
// set() 메서드는 체인으로 연결할 수 있다.
userRoles
.set(u1,'User')
.set(u2,'User')
.set(u3,'Admin');
set()
메서드를 사용해 역할을 할당한다.
userRoles.get(u2); // "User"
u2의 역할을 알아볼 때는 get()
메서드를 쓰면 된다.
keys()
메서드는 맵의 키를, values()
메서드는 값을, entries()
메서드는 첫 번째 요소가 키이고 두 번째 요소가 값인 배열을 각각 반환한다.
WeakMap
WeakMap은 다음 차이점을 제외하면 Map과 동일하다.
- 키는 반드시 객체여야 한다.
- WeakMap의 키는 가비지 콜렉션에 포함될 수 있다.
- WeakMap은 이터러블이 아니며
clear()
메서드도 없다.
일반적으로 자바스크립트는 코드 어딘가에서 객체를 참조하는 한 그 객체를 메모리에 계속 유지한다. 하지만 WeakMap에서는 그렇지 않기 때문에 이터러블이 될 수 없다. 그 이유는 가비지 콜렉션 중인 객체를 노출할 위험이 크기 때문이다.