Map和Set常见报错根源是类型误用与行为错位:对象作键须用.get()而非方括号;Set存在性检查用.has()而非includes();Set不可下标访问或取length;对象去重需手动处理引用;JSON.stringify前须先转数组结构。

记 Map 和 Set 的常见报错,关键不是背错误信息,而是盯住“类型误用”和“行为错位”这两类根源。下面按高频场景归类,每条都对应一个典型错误、一句话本质解释、以及一句可直接抄的修正口诀。
把对象当 Map 键却用 Object 方式访问
错误现象:obj[{}] 能写入但所有空对象都撞成同一键;map[{}] === map[{}] 报错或返回 undefined。
本质:Object 强制转字符串作键,Map 不支持点号/方括号访问,必须用 .get()。
口诀:对象作键选 Map,取值不用中括号,必须 .get(key)
用数组 includes 判断存在性,却已建了 Set
错误现象:写了 const seen = new Set(ids); if (arr.includes(id)) { ... },明明有 Set 却没用上。
本质:Set 的 .has() 是 O(1),数组 .includes() 是 O(n),大数组里查 10 万次慢百倍。
口诀:Set 已建就别再用 includes,存在性只认 .has(value)
去重后仍用数组方法操作 Set
错误现象:const unique = new Set(arr); unique[0] 得 undefined;unique.length 是 undefined。
本质:Set 没索引、没 length、不支持下标访问,它只回答“有没有”,不回答“第几个”。
口诀:Set 不是数组,没有 [0]、没有 .length,要取值先转数组 Array.from(set)
误以为对象内容相同就自动去重
错误现象:new Set([{a:1}, {a:1}]).size === 2,但预期是 1。
本质:Set 用 SameValueZero 判等(即 ===),对象按引用比较,两个字面量对象地址不同。
口诀:对象去重要看引用,内容相同≠同一个,想按字段去重得手动 map + Set
JSON.stringify 直接序列化失败
错误现象:JSON.stringify(new Map([['k', 'v']])) 返回 "{}";JSON.stringify(new Set([1,2])) 也是 "{}"。
本质:Map/Set 没有可枚举自有属性,JSON 只处理 plain object 和 array。
口诀:要转 JSON 先转结构:Array.from(map) 或 [...set],再 stringify


















