# ❓介绍下 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) | 不能遍历 |
那么这样看起来会不会好很多呢~呼呼哈嘿。(好吧我承认表格有点难看😞)