Objects and arrays cover most needs โ Map and Set cover the cases where they get awkward.
Set โ uniqueness for free
const unique = [...new Set([1, 1, 2, 3, 3])]; // [1,2,3] โ THE dedupe idiom const seen = new Set(); seen.add(id); seen.has(id); // O(1) โ vs arr.includes() which is O(n) seen.size;
Any "have I seen this before?" logic wants a Set โ visited nodes in graphs, selected IDs, permission flags.
Map โ a better dictionary
const m = new Map();
m.set("a", 1);
m.set(someObject, "metadata"); // ANY key type โ objects, functions...
m.get(someObject);
m.size; // objects need Object.keys(o).length
for (const [k, v] of m) { ... } // iterates in INSERTION order, guaranteedDecision rules
- String keys + JSON round-trips + dot access โ plain object is fine
- Non-string keys, frequent add/delete, need .size, order matters โ Map
- Frequency counters: object is fine; Map is cleaner
- WeakMap: keys are weakly held โ attach metadata to DOM nodes without preventing garbage collection (framework internals; know it exists for interviews)