mapset ES6에서 새로 도입된 데이터 구조이다.
맵은 키와 값을 연결한다는 점에서 객체와 비슷하고, 셋은 중복을 허용하지 않는다는 점만 제외하면 배열과 비슷하다.

Map

ES6 이전에는 키와 값을 연결하기 위해 객체를 사용했는데 이런 목적으로 객체를 사용하면 여러 가지 단점이 생긴다.

  • 프로토타입 체인 때문에 의도하지 않은 연결이 생길 수 있다.
  • 객체 안에 연결된 키와 값이 몇 개나 되는지 쉽게 알아낼 방법이 없다.
  • 키는 반드시 문자열이나 심볼이여야 하므로 객체를 키로 써서 값과 연결할 수 없다.
  • 객체는 프로퍼티 순서를 전혀 보장하지 않는다.

Map객체는 이들 결함을 모두 해결했고, 키와 값을 연결할 목적이라면 객체보다 나은 선택이다.

사용자 객체가 여렷 있고 각각 역할을 부여하는 경우

const user1 = {name: 'Cynthia'};
const user2 = {name: 'Jackson'};
const user3 = {name: 'Olive'};
const user4 = {name: 'James'};

맵을 만든다.

const userRoles = new Map();

맵의 set() 메서드를 이용해 사용자 역할을 할당한다.

userRoles.set(user1, 'User');
userRoles.set(user2, 'User');
userRoles.set(user3, 'Admin');
// 제임스에겐 역할이 없다.

맵에 이미 존재하는 키에 set()을 호출하면 값이 교체된다.
set() 메서드는 체인으로 연결할 수도 있다.

userRoles
    .set(user1, 'User');
    .set(user2, 'User');
    .set(user3, 'Admin');

생성자에 배열의 배열을 넘기는 형태로 써도 된다.

const userRoles = new Map([
    [user1, 'User'],
    [user2, 'User'],
    [user3, 'Admin'],
]);

해당하는 유저의 역할을 알아보는 경우
get() 메서드를 사용한다.

userRoles.get(user2);    // 'User'

맵에 존재하지 않는 키에 get을 호출하면 undefined 반환
맵에 키가 존재하는지 확인하는 has() 메서드도 있다.

userRoles.has(user1);    // true
userRoles.get(user1);    // 'User'
userRoles.has(user4);    // false
userRoles.get(user4);    // undefined

size 프로퍼티는 맵의 요소 숫자를 반환한다.

userRoles.size;    // 3

keys() = 맵의 키,
values() = 값,
entries() = 첫 번째 요소가 키, 두 번째 요소가 값인 배열을 반환.

맵의 요소를 지울 때는 delete() 메서드를 사용한다.

userRoles.delete(user1)
userRoles.size    // 2

모두 지울 때는 clear() 메서드 사용한다.

userRoles.clear();
userRoles.size    // 0

WeekMap

WeekMap과 Map의 차이점

  • 키는 반드시 객체여야 한다.
  • WeekMap의 키는 가비지 콜렉션에 포함될 수 있다.
  • WeekMap은 이터러블이 아니며 clear() 메서드도 없다.

WeekMap의 이런 특징은 객체 인스턴스의 전용키를 저장하기에 알맞다.

Set

셋은 중복을 허용하지 않는 데이터 집합이다.

한 사용자에게 여러 역할을 할당하는 경우

add() 메서드를 사용해 추가한다.

const roles = set();
roles.add('User')    // Set ['User']
roles.add('Admin')    // Set ['User', 'Admin']
roles.size    // 2

Map과 마찬가지로 size 프로퍼티가 있다.

Set의 장점은 추가하려는 것이 이미 셋에 있는지 확인할 필요가 없는 것이다.

역할을 제거할 때는 delete() 를 호출하고 존재하던 것을 제거에 성공했다면, true를 반환 아니면 false를 반환한다.

roles.delete('User')    // true
roles.delete('Hi')    // false

WeekSet

위크셋은 객체만 포함할 수 있고 이 객체들은 가비지 콜렉션의 대상이 된다. 위크셋의 용도는 매우 적으며 실제 용도는 주어진 객체가 셋 안에 존재하는지 아닌지를 알아보는 것 뿐이라해도 될 정도이다.