Map

Map 객체는 속성(Key)/값(Value) 쌍으로 구성된 객체입니다.

영상 강의

PART 1



예제

맵은 자바스크립트에서 자주 사용되는 데이터 구조입니다. 기존 코드에선 객체를 이용해서 해시맵을 생성했습니다.

var hashMap = {};

hashMap.key1 = 'value1';
hashMap['key2'] = 'value2';

하지만 이 방법은 특정 프로퍼티 이름으로 인한 예상치 못한 함수 오버라이드(override)로부터 안전하지 않습니다.




 
 







hashMap.hasOwnProperty = '의도적으로 객체의 hasOwnProperty와 충돌시킴';

for (var key in hashMap) {
  // Uncaught TypeError: hashMap.hasOwnProperty is not a function
  if (hashMap.hasOwnProperty(key)) {
    var value = hashMap[key];
    console.log(`key => ${key}`);
    console.log(`value => ${value}`);
  }
}

반면 맵 객체는 이러한 문제를 발생시키지 않습니다. 맵 객체는 get, set 그리고 has 등의 메소드를 제공합니다.

let map = new Map();

map.set('name', '야무');
map.get('name'); // 야무
map.has('name'); // true

맵 객체의 놀랍고 재미난 점은 키 값으로 문자열만 쓰지 않아도 된다는 것입니다. 어떤 타입을 전달해도 문자열로 형변환 하지 않습니다.

let map = new Map([
    ['이름', '야무'],
    [true, 'false'],
    [1, '하나'],
    [{}, '객체'],
    [function () {}, '함수']
]);

for (let key of map.keys()) {
    console.log(typeof key);
    // string
    // boolean
    // number
    // object
    // function
}

주의!

함수나 객체처럼 기본형 데이터 타입이 아닌 타입을 사용하면 map.get() 같은 메소드를 사용할 때 비교 연산자가 제대로 동작하지 않습니다. 따라서 문자, 불리언, 숫자 같은 기본형 데이터 타입을 계속 쓰는 것이 좋습니다.

.entries() 메서드를 사용하면 맵을 손쉽게 순환할 수 있습니다.

for (let [key, value] of map.entries()) {
  console.log(key, value);
  // '이름', '야무'
  // true, 'false'
  // 1, '하나'
  // {}, '객체'
  // function () {}, '함수'
}

참고