Object 와 Map 비교
Object는 이전부터 존재했다.- 여러 필드와 그에 맞는 데이터, 메서드를 가진 '객체' 로서 사용되기 위해 만들어졌다.
Map은 ES6 에서 새롭게 도입되었다.key와value쌍을 가진 데이터를 손쉽게 다루기 위한 것이 기본 목적이다.
차이
Object 와 Map 은 얼핏보면 Object 가 Map 의 상위호환으로 느껴질 수 있다. 그러나, Object 와 Map 은 특징에 따른 명백한 차이가 있다.
객체의 key 는 String 혹은 Symbol 만 가능하다.
const obj1 = {};
const obj2 = {};
const o = {
[obj1]: "obj1",
[obj2]: "obj2",
};
console.log(o); // {[object Object]: 'obj2'}
const map = new Map();
map.set(obj1, "obj1");
map.set(obj2, "obj2");
console.log(map); // Map(2) {{…} => 'obj1', {…} => 'obj2'}
console.log(map.get(obj1)); // obj1
- 객체에
key로서Object를 넣으면,toString()의 결과인[object Object]문자열이key가 된다. - 반면,
Map에는key로Object를 넣으면,Object자체가key가 될 수 있다.
의도치 않은 상속
Map은 명확히set()이라는 메서드를 통해 데이터를 삽입한다.Object는 단순 프로퍼티 접근 방식으로 데이터를 삽입한다.
내가 삽입한 프로퍼티와 prototype 에 의해 자동으로 상속된 프로퍼티를 구분하기 힘들어질 수도 있다.
이름 충돌
프로퍼티 접근 방식으로 데이터를 삽입하게 되면, prototype 에 대한 의도치 않은 쉐도잉과 같은 문제가 발생할 수 있다.
그럴 일은 적겠지만, 실수로 hasOwnProperty 라는 이름의 프로퍼티에 값을 덮어씌운다면, prototype 에서 제공하는 hasOwnProperty 에 접근하는 나이브한 코드가 정상적으로 작동하지 않을 수 있다.
// ...
obj.hasOwnProperty(x); // 기존에 사용하던 코드
obj.hasOwnProperty = "xxx"; // 재정의
Object.hasOwnPrototype.call(obj, key); // 예방 코드
위 경우는
Object.hasOwn()이라는 간결한 새 메서드를 사용하면 아무런 문제 없다.
Object 의 나쁜 사용성 1: size()의 부재
Map에는size()라는 크기를 구하는 의도가 명확한 메서드가 존재한다.Object는 열거 가능한 프로퍼티를 배열로 뽑아내는Object.keys()와 같은 메서드와 함께.length를 사용할 수는 있지만, 명확히 프로퍼티의 사이즈가 몇인지 구하는 메서드가 없으며, 프로퍼티의 사이즈를 구한다는 개념 자체도 애매하다.
Object 의 나쁜 사용성 2: 반복
Object는for ... in혹은Object.keys(),Object.values(),Object.entries()를 통해 반복이 가능하지만, 추가적인 오버헤드가 필요하다.- 또한
for ... in은 상속받은 열거 가능한 속성도 순환에 포함시키므로 혼란을 줄 수 있다. Symbol.iterator가 구현되어있지 않아서,for ... of구문을 사용할 수 없다.
- 또한
Map은Symbol.iterator가 명확하게 구현되어for ... of등의 구문을 사용할 수 있다.
Object 의 나쁜 사용성 3: 제거
Object는 delete operator 를 통해 일일이 속성을 제거해야 하며, 한번에 제거하는 명령이 따로 있지 않다.Map은Map.prototype.delete()메서드를 통해 하나씩 키를 지울 수도 있고,Map.prototype.clear()라는 명확한 메서드를 통해 모든 속성을 제거할 수도 있다.
Object 의 나쁜 사용성 4: 속성 존재 확인
Object는 속성의 존재 확인이 가끔 모호하다.const obj = {a: undefined}라는 객체가 있다면,obj.a의undefined라는 결과는 속성이 있어서undefined인지 값이undefined인지 구분하기 모호하다.- 반면
Map에는 존재 여부를 명확히 반환하는has()메서드가 존재한다.
성능 차이
- 성능도 일반적으로
Map이 더 좋다.- 메모리와 연산속도 모두
Map이 보통 우수하다. - 그러나 정수를 키로 하는 오브젝트의 경우, 속성의 수가 적을 때는
Object가 더 빠르다.
- 메모리와 연산속도 모두
레퍼런스
MDN 문서 - Map
oneook - 번역-자바스크립트-Map을-Object-대신-사용해야할-때는-언제일까요
https://www.zhenghao.io/posts/object-vs-map#map-for-hash-map
'자바스크립트 > 인터뷰' 카테고리의 다른 글
| 자바스크립트의 대표적인 함수 정의 문법 두가지에 대해 알고 있나요? (0) | 2023.01.11 |
|---|---|
| == (non strict euality) 와 === (strict euality) 의 차이를 말해보세요. (0) | 2023.01.11 |
| 자바스크립트의 splice() 함수에 대해 설명해보세요. (0) | 2022.12.28 |
| var 의 문제점을 짚어보고 let, const 와 비교해보세요. (0) | 2022.12.17 |
| array slice 메서드에 대해서 설명해보세요. (0) | 2022.12.17 |