Map是键值对容器,Set是唯一值集合;结构上Set存单值而Map存key→value对,键可为任意类型;查找时Set用has()判存在,Map用get()取值、has()判键;Set自动去重(NaN相等),Map键唯一但值可重复;场景上数组去重用Set,对象数组按字段去重或DOM缓存用Map;Object键受限且无size属性,Map原生支持迭代与插入序。

直接说核心:Map 是键值对容器,Set 是唯一值集合。面试时别堆概念,用对比+场景+代码片段三步讲清,考官立刻觉得你有实战经验。
先说清楚本质区别
不是背定义,是点出关键差异:
-
结构不同:Set 存的是单个值(
value),没有键;Map 存的是成对的key → value,键可以是任意类型(包括对象、函数、NaN) -
查找逻辑不同:Set 只能用
has()判断某个值是否存在;Map 用get(key)拿值,has(key)判断键存不存在 -
重复规则不同:Set 自动去重(SameValueZero 比较,所以
NaN和NaN被视为相等);Map 的键必须唯一,后设同键会覆盖前值,但值可以重复
重点讲清典型使用场景
光说“啥是 Map/Set”没分量,得接真实需求:
-
数组去重优先用 Set:
[...new Set(arr)]简洁高效,天然支持NaN,比filter + indexOf更可靠 -
对象数组按字段去重用 Map:比如按
id去重用户列表,用map.set(item.id, item),再取map.values(),避免手写双重循环 - 需要缓存计算结果或映射关系时选 Map:如把 DOM 元素作为 key 存关联数据,Object 不行(key 强制转字符串),Map 可以原样存引用
被问到“为什么不用 Object 代替 Map?”这样答
别只说“Map 键更灵活”,要指出硬伤:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- Object 的 key 只能是字符串或 Symbol,其他类型(如
{a:1}、function f(){})会被自动转成"[object Object]"或"function f(){}",导致冲突 - Object 没有内置的
size属性,要算长度得Object.keys(obj).length,且遍历顺序不保证插入顺序(ES2015+虽已规范,但老环境仍有风险) - Map 是迭代器原生对象,可直接用
for...of、forEach、解构,Object 还得多包一层Object.entries()
附一个高频手写题的简洁解法
题目:“实现一个 LRUCache,要求 get 和 put 时间复杂度 O(1)”
答案核心就是 Map —— 它保持插入顺序,且 get/set 都是 O(1):
class LRUCache {<br> constructor(capacity) {<br> this.cache = new Map();<br> this.capacity = capacity;<br> }<br> get(key) {<br> if (!this.cache.has(key)) return -1;<br> const val = this.cache.get(key);<br> this.cache.delete(key); // 触发更新顺序<br> this.cache.set(key, val);<br> return val;<br> }<br> put(key, value) {<br> if (this.cache.has(key)) this.cache.delete(key);<br> this.cache.set(key, value);<br> if (this.cache.size > this.capacity) {<br> this.cache.delete(this.cache.keys().next().value); // 删除最久未用项<br> }<br> }<br>}

















