키(key)-값(value) 쌍을 저장하며 각 쌍의 삽입 순서를 기억한다. 아무 값이나 키 또는 값으로 사용할 수 있다.
Map
과 Object
객체는 매우 유사하다. 구조적으로 두 객체는 키(key)라는 식별자를 사용한다. 즉 키를 통해 값을 검색하고 삭제할 수 있다. 단지 우리는 Map
객체가 늦게 등장했다는 사실만 알 뿐이다. 사실 Map
이라는 객체가 나오기 전까지 Object
객체가 비슷한 역할을 수행해 왔었다. 이렇다 보니 ECMAScript 팀이 바보가 아닌 이상은 역할이 겹치는 Map
객체를 힘들게 추가하지 않았을 것이라는 생각이 들 것이다. 그렇다면 두 객체가 어떠한 차이가 있는지 알아보자. 간단한 차이를 보여주지만 Map
객체를 명시적으로 선택하여 사용해야 하는 이유로는 충분하다.
항목 | Map | Object |
---|---|---|
태생적 | 오로지 키(key)와 값(value)에 충실한 객체이며 내부적으로 어떠한 숨겨진 키가 없으므로 사용하는 키와 충돌할 일이 없다. | 기본적으로 프로토타입(prototype) 기반으로 객체가 구성되므로 사용자가 지정한 키와 충돌할 수 있다는 것을 고려해야 한다. |
키 타입 | 모든 값(함수, 객체 또는 원시 데이터)을 키를 사용한다 | String 또는 Symbol 만 가능하다. |
키 정렬 | 키의 삽입 순서에 따라 정렬이 된다. | 근본적으로 키 순서에 대한 메커니즘이 완전하지 못하다. |
크기 | 키의 수는 기본적으로 size 프로퍼티로 명확하게 확인된다. | Map 객체의 프로토타입 속성인 size 처럼 적용된 키의 수를 확인하는 명확한 방법을 가지고 있지 않으므로 우회적인 방법을 사용해야 한다. |
반복 | 이터러블(iterable) 객체이므로 이터레이터(iterotor) 프토토콜을 준수한다. 따라서 직접적인 반복 처리가 가능하다. | 이터레이터(iterotor) 프토토콜을 준수하지 않으므로 직접적으로 반복할 수 없다. |
성능 | 단순히 키와 값을 추가하고 제거하는 일반적인 작업에서 Object 보다 더 나은 성능을 갖는다. | 키와 값을 자주 추가하고 삭제하는 데에 최적화되어 있지 않다. |
직렬화 및 구문 분석 | 기본적인 지원이 없으므로 우회적인 방법으로 가능하다. | JSON.parse() , JSON.stringify() 메소드를 사용하여 직렬화를 할 수 있다. |
객체의 인스턴스(instance) 생성을 지원한다. 생성자 함수를 통해서만 생성이 가능하다.
새로운 Map
객체의 인스턴스를 생성한다.
삽입 순서에 따라 키(key)-값(value) 쌍을 생성하는 반복자(iterator) 객체를 반환한다.
모든 항목을 제거한다.
지정된 키를 통해 항목을 제거한다.
삽입된 순서대로 각 항목의 키(key)-값(value) 쌍을 포함하는 새로운 반복자(iterator) 객체를 반환한다.
삽입된 항목을 순서에 따라 한번 순회하면서 지정된 함수를 실행한다.
지정된 키(key)에 해당하는 값을 반환한다.
지정된 키(key)를 가진 항목이 존재하는지 여부를 반환한다.
현재 Map
객체에 삽입된 순서대로 각 항목의 키(key)를 포함하는 새로운 반복자(iterator) 객체를 반환한다.
지정된 키(key)와 값(value)으로 새로운 항목을 추가하거나 업데이트 한다.
현재 Map
객체에 삽입된 순서대로 각 항목의 값(value)를 포함하는 새로운 반복자(iterator) 객체를 반환한다.
정적(static) 멤버를 의미하며 인스턴스(instance)에 상속되어 사용할 수 없고 오로지 하위를 포함하여 객체(object) 또는 인터페이스(interface) 자신에서 해당 멤버에 접근이 가능하다.
지정된 콜백 함수에서 반환된 값을 사용하여 지정된 반복 가능한 항목의 요소를 그룹화한다.