Map - JavaScript | MDN
The Map object holds key-value pairs and remembers the original insertion order of the keys. Any value (both objects and primitive values) may be used as either a key or a value.
developer.mozilla.org
22.01.30 기준 작성
아직 완벽히 이해하지 못해 정확하지 않을 수 있습니다. 공식문서와 비교하며 읽어주세요.
Key equality
- Key의 동일성은 sameValueZero 알고리즘에 기반한다.
- NaN !== NaN임에도 NaN은 NaN과 같다고 간주된다. 다른 값들도 === 연산에 기반하여 같은지 결정된다.
- 이전에는 그렇지 않았지만, 현재 ECMAScript specification에서 -0, +0은 같다고 간주된다. 자세한 내용은 브라우저 호환성의 "Value equality for -0 and 0"에서 확인할 수 있다.
Objects vs. Maps
Object와 Map은 비슷하다. 이 둘 모두 key와 value를 짝지으며, value를 얻거나, key를 삭제하고, 어떤 값이 key로 저장되어 있는지 확인한다. 이러한 이유로 (그리고 이전에는 대안이 없었기 때문에), Object는 Map처럼 사용되어왔다.
그러나 Map이 더 선호되는 몇몇 경우가 있다:
Map | Object | |
Accidental Keys | Map은 디폴트로 가지고 있는 key가 없다. 명시적으로 넣어준 key만 가진다. | Object는 prototype을 가지고 있어서 디폴트 key를 가지고 있다. 디폴트 key가 직접 추가할 key와 충돌할 수 있으니 주의해야한다. Note: ES5에서는 Object.create(null)을 사용해 이 문제를 우회할 수 있으나, 극히 드물게 행해진다. |
Key Types | 모든 값이 Map의 key가 될 수 있다. (함수, object, 모든 primitive 포함) | String이나 Symbol만 Object의 key가 될 수 있다. |
Key Order | Map의 key순서는 단순하고 직관적이다: Map은 entry, key, value를 삽입한 순서대로 순회한다. | Object의 key가 순서대로 되어있긴 하지만, 항상 그런것은 아니며 그 순서가 복잡하다. 그렇기 때문에 Property의 순서에 의존하지 않는 것이 가장 좋다. |
Size | Map의 item 개수는 size property를 통해 쉽게 얻을 수 있다. | Object의 item 개수는 직접 구해야 한다. (예시 1) |
Iteration | Map은 iterable 해서 직접적으로 iteration 할 수 있다. | Object는 iteration protocol을 구현하지 않았으므로, 자바스크립트의 for...of 문장을 사용해 직접적으로 iteration 할 수 없다. Note: - Object는 iteration protocold을 구현(implement)할 수 있다. 또는 Object.keys나 Object.entries를 활용해 iterable을 얻을 수 있다. - for...in 문장으로 object의 enumerable property를 순회할 수 있다. |
Performance | 빈번하게 key-value 쌍을 추가하거나 삭제하는 경우에 더 나은 퍼포먼스를 보인다. | Key-value 쌍을 빈번하게 추가하거나 삭제하는 경우에 최적화되어있지 않다. |
Serialization and parsing | Serialization이나 parsing을 기본적으로 지원하지 않는다. (그러나 JSON.stringify()와 replacer argument를 함께 사용해서 serialization을, JSON.parse()와 reviver argument를 함께 사용해서 parsing을 직접 구현할 수 있다. 참고) |
JSON.stringify()를 통해 Object를 JSON으로 serialization하는 것, JSON.parse()를 통해 JSON을 object로 parsing하는 것을 기본적으로 지원한다. |
예시
- Object의 item 개수 구하기
const obj = {} obj['a'] = 1 obj['b'] = 1 const objLen = Object.keys(obj).length console.log(objLen) // 2
아직 해결하지 못한 궁금증 (진행 중)
- Object.create(null)로 key충돌 문제를 해결할 수 있지만, 흔하지 않다는게 무슨 말일까
- Map도 결국 하나의 객체이고, prototype을 갖는데 왜 디폴트 키가 없고, Object는 prototype이 있어서 디폴트 키가 있는걸까
- Symbol은 왜 만들어지게 되었을까
- Iterable의 정확한 의미가 뭘까
- enumerable의 정확한 의미는 뭘까
- Map의 serialization과 parsing 예시
'JAVASCRIPT' 카테고리의 다른 글
Javascript 비교연산자 (0) | 2022.02.06 |
---|---|
DOM과 Virtual DOM (0) | 2022.01.16 |
자바스크립트 Promise (0) | 2022.01.14 |
자바스크립트 가비지 콜렉션과 순환참조 (0) | 2021.12.10 |
자바스크립트 Execution Context (0) | 2021.12.08 |