WeakSet的学习,应用场景

本文介绍了 JavaScript 中 WeakSet 的相关知识。WeakSet 是不重复对象的集合,成员只能是对象且为弱引用,无 size 属性、不可遍历。其应用场景主要是存储 DOM 节点以避免内存泄露。还介绍了 WeakSet 的语法,它是构造函数,有 add、delete、has 三个方法。

WeakSet是什么?

WeakSet 和 Set 类似,都是不重复的值的集合,但是和 Set 有两点不同:

  1. WeakSet 的成员只能是对象
  2. WeakSet 的对象都是弱引用

即WeakSet 中对对象的引用不会被考虑进垃圾回收机制,即只要没有其他的对象引用该对象,则该对象就会被回收,而不管它在不在 WeakSet

    (由于这个特性,所以 WeakSet 适合临时存放一组对象和跟对象绑定的信息)
  • => 3. WeakSet 没有size属性,没法遍历(故没有 forEach 方法)
    因为 WeakSet 中有多少个成员取决于(没有其他对象对WeakSet成员的引用后)垃圾回收机制有没有运行,运行前后可能成员的个数是不一样的,而垃圾回收机制何时运行是不可预测的,所以 ES6 规定 WeakSet 不能被遍历

WeakSet 的应用场景/ 好处

用于存储DOM节点,而不用担心这些节点从文档移除时会引发内存泄露
即可以用来避免内存泄露的情况
例子:

  const foos = new WeakSet()
  class Foo {
  constructor() {
    foos.add(this)
  }
  method() {
    if(!foos.has(this)) {
      throw new TypeError("Foo.prototype..method 只能在Foo的实例上调用")
    }
  }
}
// 
这段代码的作用是保证了Foo 的实例方法只能在Foo的实例上调用。
// 这里用WeakSet的好处:数组foos对实例的引用不会被计入内存回收机制,所以删除实例时无需考虑foos, 也不会出现内存泄露

WeakSet 的语法

  1. WeaSet 是一个构造函数,通过 new WeakSet() 可生成一个实例
const ws = new WeakSet();

WeakSet作为构造函数:可接收数组或类数组对象作为其参数:则数组的所有成员 都会自动成为 WeakSet 对象的成员

注:
(1) 数组的成员只能是对象(因为WeakSet的成员只能是对象)
(2) 成为 WeakSet 的成员的是数组的成员,而不是数组本身。

  1. WeakSet 有三个方法:add, delete, has
    WeakSet.prototype.add(value) 向WeakSet 实例添加一个成员
    WeakSet.prototype.delete(value) 清除 WeakSet 实例的指定成员
    WeakSet.prototype.has(value) 判断某个值是否在WeakSet 实例中,返回布尔值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值