ES6 新特性之 WeakSet 数据结构

概述

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

  • WeakSet 的成员只能是对象,而不能是其他类型的值
  • WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用
  • WeakSet 不可遍历
const ws = new WeakSet()
ws.add(1)
// TypeError: Invalid value used in weak set
ws.add(Symbol())
// TypeError: invalid value used in weak set

上面代码试图向 WeakSet 添加一个数值和 Symbol 值,结果报错,因为 WeakSet 只能放置对象

语法

WeakSet 可以接受一个数组或类似数组的对象作为参数

const a = [[1, 2], [3, 4]]
const ws = new WeakSet(a)
// WeakSet {[1, 2], [3, 4]}

数组的成员只能是对象

const b = [3, 4]
const ws = new WeakSet(b)
// Uncaught TypeError: Invalid value used in weak set(…)

WeakSet 结构有以下三个方法

方法 描述
add(value) 向 WeakSet 实例添加一个新成员
delete(value) 清除 WeakSet 实例的指定成员
has(value) 返回一个布尔值,表示某个值是否在 WeakSet 实例之中

下面是一个例子

const ws = new WeakSet()
const obj = {}
const foo = {}

ws.add(obj)
ws.has(obj) // true
ws.has(foo)    // false

ws.delete(obj)
ws.has(obj) // false

WeakSet 的一个用处,是储存 DOM 节点,而不用担心这些节点从文档移除时,会引发内存泄漏

还有个用处是保证类的方法只能在实例上调用

const foos = new WeakSet()
class Foo {
  constructor () {
    foos.add(this)
  }
  method () {
    if (!foos.has(this)) {
      throw new TypeError('Foo.prototype.method 只能在Foo的实例上调用!')
    }
  }
}

上面代码使用 WeakSet 的好处是,foos 对实例的引用,不会被计入内存回收机制,所以删除实例的时候,不用考虑 foos,也不会出现内存泄漏

本文转载自 http://es6.ruanyifeng.com/#docs/set-map#WeakSet 并进行整理

除特殊说明外本人博客均属原创,转载请注明出处:http://blog.johnhan.cn/blog_1040.html
鄂ICP备17018604号-1  鄂公网安备42060702000030号