Set
Set 类似于数组,但是成员的值都是唯一的,没有重复。Set 本身是一种构造函数,用来生成 Set 数据结构
Set 可以接受一个数组作为参数,用来初始化
向 Set 中加入值时,不会发生类型转换。Set 内部判断两个值是否相同时使用的算法叫做「Same-value equality」,类似于精确相等运算符
Set 结构的实例有以下属性
- Set.prototype.constructor:构造函数,默认是 Set 函数
- Set.prototype.size:返回 Set 实例的成员总数
Set 实例的方法分为两大类
- 操作方法
- 遍历方法
操作方法
- add(value):添加某个值,返回 Set 结构本身
- delete(value):删除某个值,返回布尔值,表示删除是否成功
- has(value):返回布尔值,表示参数是否为 Set 的成员
- clear():清除所有成员,没有返回值
遍历方法
- keys():返回键名的遍历器
- values():返回键值的遍历器
- entries():返回键值对的遍历器
- forEach():使用回调函数遍历每个成员
Set 的遍历顺序就是插入顺序
由于 Set 结构没有键名,只有键值,所以 keys() 和 values() 的行为完全一致
WeakSet
WeakSet 和 Set 类似,也是不重复的值的集合,区别在于
- WeakSet 的成员只能是对象,而不能是其它类型的值
- 向 WeakSet 添加一个非对象的值,会报错
- WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用
- 如果其它对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象是否还存在于 WeakSet 之中
- 因为垃圾回收机制依赖引用计数,如果一个值的引用次数不为 0,垃圾回收机制就不会释放这块内存。结束使用该值之后,有时会忘记取消引用,导致内存无法释放,进而可能会引发内存泄漏
- WeakSet 里面的引用都不计入垃圾回收机制,所以不存在这类问题
- WeakSet 适合临时存放一组对象,以及存在跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失
因此,WeakSet 的成员是不适合引用的,因为它会随时消失
WeakSet 内部有多少个成员取决于垃圾回收机制有没有运行,运行前后很可能成员数量是不一样的,因此 ES6 规定 WeakSet 不可遍历
WeakSet 是一个构造函数,可以使用 new 命令创建 WeakSet 数据结构
WeakSet 可以接受一个数组或类数组的对象作为参数
WeakSet 结构有 3 个方法
- WeakSet.prototype.add(value):向 WeakSet 实例添加一个新成员
- WeakSet.prototype.delete(value):清除 WeakSet 实例的指定成员
- WeakSet.prototype.has(value):返回布尔值,表示某个值是否在 WeakSet 实例中
WeakSet 没有 size 属性,没有办法遍历其成员
Map
Map 数据结构类似于对象,也是键值对的集合,但是「键」的范围不限于字符串,各个类型的值都可以作为键
Map 可以接受一个数组作为参数,该数组的成员是一个个表示键值对的数组
如果对同一个键多次赋值,后面的值将覆盖前面的值
如果读取一个未知的键,则返回 undefined
Map 结构的实例属性和操作方法
- size 属性:返回 Map 结构的成员总数
- set(key, value):设置 key 所对应的键值,返回整个 Map 结构,如果 key 已经有值,则键值会被覆盖,否则就新生成该键
- get(key):读取 key 对应的键值,如果找不到 key,则返回 undefined
- has(key):返回布尔值,表示某个键是否在 Map 数据结构中
- delete(key):删除某个键,返回 true,删除失败,则返回 false
- clear():清除所有成员,没有返回值
Map 原生提供了 3 个遍历器生成函数和 1 个遍历方法
- keys():返回键名的遍历器
- values():返回键值的遍历器
- entries():返回所有成员的遍历器
- forEach():遍历 Map 的所有成员
Map 的遍历顺序就是插入顺序
WeakMap
WeakMap 和 Map 类似,也用于生成键值对的集合,区别在于
- WeakMap 只接受对象作为键名(null 除外),不接受其它类型的值作为键名
- WeakMap 的键名所指向的对象不计入垃圾回收机制
WeakMap 只有 4 个方法可用
- get()
- set()
- has()
- delete()