集合
哈希结构 键值对对象
WeakSet
WeakSet 中的对象都是弱引⽤用,即垃圾回收机制不不考虑 WeakSet 对该对象的引⽤用,也就是说,如果其
他对象都不不再引⽤用该对象,那么垃圾回收机制会⾃自动回收该对象所占⽤用的内存,不不考虑该对象还存在于
WeakSet 之中。
这是因为垃圾回收机制依赖引⽤用计数,如果⼀一个值的引⽤用次数不不为0 ,垃圾回收机制就不不会释放这块内
存。结束使⽤用该值之后,有时会忘记取消引⽤用,导致内存⽆无法释放,进⽽而可能会引发内存泄漏漏。
WeakSet ⾥里里⾯面的引⽤用,都不不计⼊入垃圾回收机制,所以就不不存在这个问题。因此,WeakSet 适合临时存
放⼀一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet ⾥里里⾯面的引⽤用就会
⾃自动消失。
由于上⾯面这个特点,WeakSet 的成员是不不适合引⽤用的,因为它会随时消失。另外,由于 WeakSet 内部
有多少个成员,取决于垃圾回收机制有没有运⾏行行,运⾏行行前后很可能成员个数是不不⼀一样的,⽽而垃圾回收机
制何时运⾏行行是不不可预测的,因此 ES6 规定 WeakSet 不不可遍历。
WeakMap
WeakMap 就是为了了解决这个问题⽽而诞⽣生的,它的键名所引⽤用的对象都是弱引⽤用,即垃圾回收机制不不将
该引⽤用考虑在内。因此,只要所引⽤用的对象的其他引⽤用都被清除,垃圾回收机制就会释放该对象所占⽤用
的内存。也就是说,⼀一旦不不再需要,WeakMap ⾥里里⾯面的键名对象和所对应的键值对会⾃自动消失,不不⽤用⼿手
动删除引⽤用。