js

WeakSet & Set & WeakMap & Map

Posted by Panda on 2022-08-04

集合

哈希结构 键值对对象

WeakSet

WeakSet 中的对象都是弱引⽤用,即垃圾回收机制不不考虑 WeakSet 对该对象的引⽤用,也就是说,如果其
他对象都不不再引⽤用该对象,那么垃圾回收机制会⾃自动回收该对象所占⽤用的内存,不不考虑该对象还存在于
WeakSet 之中。

这是因为垃圾回收机制依赖引⽤用计数,如果⼀一个值的引⽤用次数不不为0 ,垃圾回收机制就不不会释放这块内
存。结束使⽤用该值之后,有时会忘记取消引⽤用,导致内存⽆无法释放,进⽽而可能会引发内存泄漏漏。
WeakSet ⾥里里⾯面的引⽤用,都不不计⼊入垃圾回收机制,所以就不不存在这个问题。因此,WeakSet 适合临时存
放⼀一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet ⾥里里⾯面的引⽤用就会
⾃自动消失。

由于上⾯面这个特点,WeakSet 的成员是不不适合引⽤用的,因为它会随时消失。另外,由于 WeakSet 内部
有多少个成员,取决于垃圾回收机制有没有运⾏行行,运⾏行行前后很可能成员个数是不不⼀一样的,⽽而垃圾回收机
制何时运⾏行行是不不可预测的,因此 ES6 规定 WeakSet 不不可遍历。

WeakMap

WeakMap 就是为了了解决这个问题⽽而诞⽣生的,它的键名所引⽤用的对象都是弱引⽤用,即垃圾回收机制不不将
该引⽤用考虑在内。因此,只要所引⽤用的对象的其他引⽤用都被清除,垃圾回收机制就会释放该对象所占⽤用
的内存。也就是说,⼀一旦不不再需要,WeakMap ⾥里里⾯面的键名对象和所对应的键值对会⾃自动消失,不不⽤用⼿手
动删除引⽤用。