ES6中的WeakSet和WeakMap

一. WeakSet

WeakSet结构与Set结构类似,也是不重复值的集合;但是,它与Set有两个区别。

  1. WeakSet的成员只能是对象,不能是其它的值;
  2. 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结构类似,用于生成键值对的集合;

  1. WeakMap只接受对象作为键名(null除外),不接受其它类型的值作为键名
  2. WeakMap的键名所指向的对象,不计入垃圾回收机制;
  3. 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弱引用只是键名,而不是键值。键值依旧正常引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值