Map / Set 与对象有什么区别

先理解原理和示例,再练习完整口述与追问。

键类型;去重规则;迭代与原型。

Map 表达键到值的映射,键可以是对象等任意常见值,保留插入顺序并提供 size。Set 表达唯一值集合,也保留插入顺序;普通对象更适合固定字段记录和 JSON 交换。Map、Set 的键比较通常采用 SameValueZero,所以 NaN 可命中,+0 与 -0 视为同一值;两个不同对象即使内容一样,也不会自动合并。

js
const set = new Set([1, 1, NaN, NaN])
console.log(set.size) // 2
const a = { id: 1 }, b = { id: 1 }
console.log(new Set([a, b]).size) // 2
const byId = new Map([[a.id, a], [b.id, b]])
console.log(byId.size) // 1,后一个值覆盖前一个

对象数组按业务字段去重,需要明确 ID 冲突时保留首项还是末项。Map 不能直接按普通对象的 JSON.stringify 期待得到全部条目,应显式转换。

Map 可用任意值作键并保持插入顺序,Set 存唯一值;二者常用 SameValueZero 规则,因此 NaN 可相等、正负零等价,对象仍按引用。普通对象键主要是字符串和 Symbol,且有原型行为。分组可以用 Map,去重按完整对象引用还是业务 ID 需要先确定。