es6 WeakMap、WeakSet、WeakRef

WeakMap

键值对

  • 其键必须是对象(弱引用),而值可以是任意的
    • 原始数据类型 是不能作为 key 的(比如 Symbol)

弱引用

  • 在计算机程序设计中,弱引用与强引用相对,是指不能确保其引用的对象不会被垃圾回收器回收的引用
  • 一个对象若只被弱引用所引用,则被认为是不可访问(或弱可访问)的,并因此可能在任何时刻被回收

弱引用垃圾回收

const wk = new WeakMap();
let key = new Array(5 * 1024 * 1024);
wl.set(key, 1);
key = null;	// 当前就只有 wk 对所引用对象的弱引用,下次垃圾回收机制执行的时候,该引用对象就会被回收掉

强引用垃圾回收


let map = new Map();
let key = new Array(5 * 1024 * 1024);

map.set(key, 1);
key = null;	// 并没有去除map对key所引用对象的强引用

map.delete(key);		
key = null;	// 此时才能去除map对key所引用对象的强引用

自动垃圾回收

  • WeakMap 可以帮你省掉手动删除与多个对象关联数据的步骤,所以当你不能或者不想控制关联数据的生命周期时就可以考虑使用 WeakMap。
  • 只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。

不可遍历

  • WeakMap内部有多少个成员,取决于垃圾回收机制有没有运行,运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的,因此 ES6 规定 WeakMap 不可遍历。
  • 故只有这四个方法:
let wk=new WeakMap()

wk.get()
wk.set()
wk.has()
wk.delete()

WeakSet

集合

  • 只能是对象的集合

不可枚举

  • WeakSet 中没有存储当前对象的列表。正因为这样,WeakSet 是不可枚举的

弱引用

  • 集合中对象的引用为弱引用。如果没有其它的对 WeakSet 中对象的引用,那么这些对象会被当成垃圾回收掉。

WeakRef

  • 处理弱引用的底层机制, 它可以将任何对象包装成弱引用,而不会阻止对象被 GC 回收
class AnyClass {
  constructor(name) {
    this.name = name;
  }
}

const obj = new AnyClass('Some Name');
const weakRef = new WeakRef(obj); // 创建一个弱引用

const derefObj = weakRef.deref(); // 获取弱引用的指向对象

// 输出: AnyClass {name: "Some Name"}
console.log(derefObj);

回收时机

  • 目标对象在事件循环的两次循环之间回收

返回弱引用的原始对象

  • 如果该 target 对象已被 GC 回收则返回 undefined
WeakRef.prototype.deref()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值