Plain object
const o = { a: 1 };
o.b = 2;
o['c'] = 3;
Object.keys(o);
Object.values(o);
Object.entries(o);
키는 문자열(또는 심볼)로 강제됩니다. 숫자 키도 문자열 '1'이 됩니다.
Map
키가 객체여도 되고, 삽입 순서를 유지하며, .size가 있습니다.
const m = new Map();
m.set('a', 1);
m.get('a');
m.has('a');
m.delete('a');
for (const [k, v] of m) { /* ... */ }
알고리즘에서 문자→개수, 값→인덱스에 Map이 잘 맞습니다.
Set
const set = new Set([1, 2, 2, 3]); // 1,2,3
set.add(4);
set.has(2);
[...set]; // 배열로
중복 제거 + 멤버십 검사에 사용합니다. JS Set은 삽입 순서를 지킵니다.
object vs Map 선택
- 키가 식별자처럼 단순하고 JSON과 오가면 object
- 키가 임의 문자열이거나 빈번히 추가/삭제·개수가 중요하면 Map
for...in/ 프로토타입이 걱정되면 Map
구조 분해
const { a, b = 0 } = obj;
const [x, y] = arr;
입력 파싱 후에도 자주 씁니다.
애너그램·빈도 패턴
function freq(s) {
const m = new Map();
for (const ch of s) m.set(ch, (m.get(ch) || 0) + 1);
return m;
}
두 Map의 크기가 같고 모든 키가 같은 횟수면 애너그램.
object 프로토타입 함정
{}에 사용자 문자열 키를 넣을 때 __proto__ 같은 키가 섞일 수 있습니다.
임의 키면 Map 또는 Object.create(null).
JSON
JSON.stringify({ a: 1 });
JSON.parse('{"a":1}');
채점 입력이 JSON인 문제는 드물지만, 디버그에 유용합니다.