普通对象只能用字符串/Symbol 作键,toString 一番能把接口撞车(1 和 '1' 同键)。Map 允许任意类型作键,还能保持插入顺序、O(1) 查找,size 属性直接取长度。Set 则天生去重——数组去重一行 [...new Set(arr)],比 filter/indexOf 快且清晰。
它们实现了迭代器接口,可直接 for...of,用展开或 Array.from 转回数组。注意:Map/Set 判断键相等用「同值零」(NaN 等于 NaN、+0/-0 相等),Object.is 更严格但日常几乎无差异。
// Set 去重 const uniq = [...new Set([1, 2, 2, 3, 3])]; // [1,2,3] // Map 用对象作键(对象普通对象做不到) const m = new Map(); const user = { id: 1 }; m.set(user, { score: 90 }); m.get(user).score = 95; console.log(m.size); // 1 for (const [key, val] of m) console.log(key, val); // WeakMap:键被回收后对应条目自动消失,适合做私有数据/缓存 const wmap = new WeakMap(); // wmap 不可枚举、不可 size——故意设计,避免泄漏实现细节