# ❓介绍下 Set、Map、WeakSet 和 WeakMap 的区别?

中所周知,这道题目是考察我们对 es6 知识的掌握,这里同样我们用表格的形式来加深我们的记忆。

定义 属性 方法 遍历
Set 类似于数组,但是成员的值都是唯一的,没有重复的值。 - constructor:构造函数,默认就是Set函数。
- size:返回Set实例的成员总数
- add(value) :添加某个值,返回 Set 结构本身(不会发生类型转换)。
- delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
- has(value):返回一个布尔值,表示该值是否为Set的成员。
- clear() :清除所有成员,没有返回值。
- keys():返回键名的遍历器。
- values():返回键值的遍历器。
- entries():返回键值对的遍历器。
- forEach():使用回调函数遍历每个成员,入参函数参数依次为键值键名集合本身
WeakSet 不重复的值的集合。WeakSet 的成员只能是对象,而不能是其他类型的值。WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。 - constructor:构造函数,默认就是WeakSet函数。
- add(value) :向 WeakSet 实例添加一个新成员,返回 Set 结构本身。
- delete(value):清除 WeakSet 实例的指定成员,返回一个布尔值,表示清除是否成功。
- has(value):返回一个布尔值,表示某个值是否在 WeakSet 实例之中。
WeakSet 不能遍历,是因为成员都是弱引用,随时可能消失,遍历机制无法保证成员的存在,很可能刚刚遍历结束,成员就取不到了。WeakSet 的一个用处,是储存 DOM 节点,而不用担心这些节点从文档移除时,会引发内存泄漏。
Map 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。 - constructor:构造函数,默认就是Map函数。
- size:返回 Map 结构的成员总数。
- set(key, value):设置键名 key 对应的键值为 value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。
- get(key):读取 key 对应的键值,如果找不到 key,返回 undefined
- has(key):返回一个布尔值,表示某个键是否在当前 Map 对象之中。
- delete(key):删除某个键,返回 true。如果删除失败,返回 false。
- clear():清除所有成员,没有返回值。
Set 遍历方法,其遍历的顺序都是成员插入的顺序。
WeakMap 生成键值对的集合。 只接受对象作为键名(null 除外),不接受其他类型的值作为键名。 键名所指向的对象,不计入垃圾回收机制。 注意,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。 - constructor:构造函数,默认就是WeakMap函数。 - set(key, value):设置键名 key 对应的键值为 value,然后返回整个 WeakMap 结构。如果key已经有值,则键值会被更新,否则就新生成该键。
- get(key):读取 key 对应的键值,如果找不到 key,返回 undefined
- has(key):返回一个布尔值,表示某个键是否在当前 WeakMap 对象之中。
- delete(key):删除某个键,返回 true。如果删除失败,返回 false。
没有遍历操作

下面来梳理简化一下上面的表格:

定义 属性 方法 遍历
Set - 类似数组
- 值唯一
- constructor
- size
- add()
- delete()
- has()
- clear()
- keys()
- values()
- entries()
- forEach()
WeakSet - 类似数组
- 成员只能是对象
- 值唯一
- 弱引用,不计入垃圾回收机制
- constructor - add()
- delete()
- has()
成员都是弱引用不能遍历
Map - 类型对象
- 任意值都能当作键名
- constructor
- size
- set(key,value)
- get(key)
- has(key)
- delete(key)
- clear()
- keys()
- values()
- entries()
- forEach()
WeakMap - 类型对象
- 键名只能是对象
- 键名不计入垃圾回收机制
- constructor - set(key,value)
- get(key)
- has(key)
- delete(key)
不能遍历

那么这样看起来会不会好很多呢~呼呼哈嘿。(好吧我承认表格有点难看😞)

这里我们附上阮老师相关的文章