一. WeakSet
WeakSet结构与Set结构类似,也是不重复值的集合;但是,它与Set有两个区别。
- WeakSet的成员只能是对象,不能是其它的值;
- WeakSet中的对象都是弱引用,即JS引擎的垃圾回收机制会自动回收WeakSet;
const a = new WeakSet();
a.add(1233) // 报错
a.add('123') // 报错
a.add({id: 1})
a.add([1,2,3])
const aa = new WeakSet([1,2,3]); // 报错
const aac = new WeakSet([{name: 'jack'}]);
const acd = new WeakSet([[1,2,3]]);
注意点: 1. 任何具有iterable接口的对象都可以作为WeakSet的参数;
2. new WeakSet(a),成为WeakSet的成员的是a数组的成员,而不是a数组本身;
3. WeakSet不具备遍历方法
WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,也就是说,如果其它对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象是否还存在WeakSet结构;
垃圾回收机制根据对象的可达性(reachability)来判断回收,如果WeakSet中的对象还能被访问到,垃圾回收机制就不释放这块内存。可能导致内存不释放,内存泄露的问题。WeakSet里面的对象引用,都不计入垃圾回收机制,所以不存在内存泄漏的问题;因此,WeakSet适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在WeakSet里面的引用就会自动消失
二. WeakMap
WeakMap结构与Map结构类似,用于生成键值对的集合;
- WeakMap只接受对象作为键名(null除外),不接受其它类型的值作为键名
- WeakMap的键名所指向的对象,不计入垃圾回收机制;
- WeakMap不具备遍历方法,且没有size属性
const a = new WeakMap();
const key = {foo:1}
a.set(key,1)
a.set(344,1) // 报错
const d = new WeakMap([[key,9]]);
const dr = new WeakMap([[[3455,9]]]); // 报错
注意点: WeakMap的键所对应的对象,可能会在将来消失;WeakMap结构有助于防止内存泄漏,WeakMap弱引用只是键名,而不是键值。键值依旧正常引用