const obj = {};
obj['key'] = 'value'; // 키는 문자열
obj[42] = 'value'; // 키는 자동으로 '42'로 변환
obj[{}] = 'value'; // 키는 '[object Object]'로 변환
const map = new Map();
map.set('key', 'value'); // 키는 문자열
map.set(42, 'value'); // 키는 숫자
map.set({}, 'value'); // 키는 객체
const obj = {};
obj['b'] = 1;
obj['a'] = 2;
console.log(Object.keys(obj)); // ['b', 'a']
const map = new Map();
map.set('b', 1);
map.set('a', 2);
console.log([...map.keys()]); // ['b', 'a']
const obj = { 'a': 1, 'b': 2 };
console.log(Object.keys(obj).length); // 2
size
프로퍼티로 크기를 바로 알 수 있음const map = new Map();
map.set('a', 1);
map.set('b', 2);
console.log(map.size); // 2
Object.prototype
을 상속받아 많은 기본 메서드와 속성을 가지고 있음. 이러한 기본 속성들은 키로 사용할 때 예기치 않은 동작을 일으킬 수 있음const obj = {};
obj['toString'] = 'value';
console.log(obj['toString']); // 'value'
const map = new Map();
map.set('toString', 'value');
console.log(map.get('toString')); // 'value'
for...in
구문이나 Object.keys()
, Object.values()
, Object.entries()
를 사용하여 반복해야 함const obj = { 'a': 1, 'b': 2 };
for (let key in obj) {
console.log(key, obj[key]);
}
for...of
구문을 사용하거나, keys()
, values()
, entries()
메서드를 사용하여 반복할 수 있음const map = new Map();
map.set('a', 1);
map.set('b', 2);
for (let [key, value] of map) {
console.log(key, value);
}
항목 | Object | Map |
---|---|---|
키 타입 | 문자열, 심볼만 가능 | 모든 타입 가능 (문자열, 숫자, 객체 등) |
키 순서 | 보장되지 않음 | 삽입 순서 유지 |
크기 계산 | Object.keys(obj).length로 계산 필요 | size 프로퍼티 사용 |
성능 | 일반 속성 접근에 최적화 | 대규모 데이터 및 빈번한 추가/삭제에 최적화 |
기본 프로토타입 | Object.prototype 상속, 기본 메서드 존재 | 기본 프로토타입 상속 없음 |
반복 | for...in, Object.keys(), Object.values(), Object.entries() 사용 | for...of, keys(), values(), entries() 사용 |
사용 예 | 일반적인 객체 리터럴, JSON 데이터 | 복잡한 키-값 저장, 빈번한 데이터 변경 |
Object
: 문자열, 심볼 키에 최적화된 전통적인 키-값 저장 방식.Map
: 다양한 타입의 키를 지원하고, 데이터 추가/삭제가 빈번한 경우에 적합한 현대적인 키-값 저장 방식.