Map用于存储任意类型键的键值对,Set用于存储唯一值;二者弥补对象和数组在语义、功能与性能上的不足,不可互相替代。

Map 和 Set 是 ES6 引入的两种原生集合类型,各自有明确的设计目的:Map 用来存键值对,Set 用来存唯一值。它们不是对象或数组的替代品,而是补足了后两者在语义、功能和性能上的短板。
Map 是带任意键的键值映射
Map 的核心是「键 → 值」的一对一关系,但它的键可以是任何类型——字符串、数字、布尔、null、undefined、Symbol,甚至对象或函数。这和普通对象有本质区别:
- 对象的键只能是字符串或 Symbol(其他类型会自动转成字符串,比如
{[1]: 'a'}实际变成{'1': 'a'}) - Map 保留原始键类型,
map.set({}, 'val')中的空对象就是独立的键,不会被混淆 - Map 有
.size属性,不用遍历就能知道有多少条记录;对象得靠Object.keys(obj).length - Map 按插入顺序迭代,对象的属性顺序在旧引擎中不保证(虽现代已基本稳定,但语义上仍不承诺)
- Map 提供
.has()、.delete()、.clear()等统一方法,对象操作得靠in、delete、循环等零散手段
Set 是自动去重的值集合
Set 存的不是键值对,而是一组互不重复的值,类似数学里的集合。它解决的是“我只要这个值是否存在”,而不是“这个值对应什么”:
- 添加重复值无效:
new Set([1, 1, 2])结果是{1, 2} - 判断存在用
.has(),比数组.includes()或.indexOf() !== -1更快(底层是哈希查找,平均 O(1)) - 不能用下标访问(没有
set[0]),也不支持索引操作;想取值得转成数组或用迭代器 - Set 的值可以是任意类型,包括对象,但注意:
set.has({})总是false,因为每次{}都是新对象,地址不同;要用同一个引用才匹配
和数组比:不是“更高级的数组”,而是不同用途
数组适合有序、可重复、需索引访问的数据;Set 和 Map 不强调顺序访问,也不提供索引。常见误区:
标签: javascript es6 java proxy 区别 键值对
还木有评论哦,快来抢沙发吧~