美文网首页
WeakSet的学习,应用场景

WeakSet的学习,应用场景

作者: 小鱼旋子 | 来源:发表于2019-06-22 20:42 被阅读0次

    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 实例中,返回布尔值

    相关文章

      网友评论

          本文标题:WeakSet的学习,应用场景

          本文链接:https://www.haomeiwen.com/subject/slavqctx.html