WeakSet

基线 广泛可用

此功能非常成熟,可以在许多设备和浏览器版本中使用。它自 2015 年 9 月.

报告反馈

描述

一个 **WeakSet** 是一个可垃圾回收值的集合,包括对象和 未注册的符号WeakSet 中的值只能出现一次。它在 WeakSet 的集合中是唯一的。

WeakSets 的值必须是可垃圾回收的。大多数 原始数据类型 可以任意创建,并且没有生命周期,因此无法存储。对象和 未注册的符号 可以存储,因为它们是可垃圾回收的。

  • Set 对象的主要区别在于
  • WeakSets 是 **仅包含对象和符号** 的集合。它们不能包含任何类型的任意值,而 Set 可以。

    WeakSet 是 *弱* 的,这意味着对存储在 WeakSet 中的对象的引用是 *弱* 持有的。如果存储在 WeakSet 中的值没有其他引用,则这些值可以被垃圾回收。

**注意:** 这也意味着没有存储在集合中的当前值的列表。WeakSets 不可枚举。

用例:检测循环引用

递归调用自身的函数需要一种方法来通过跟踪已处理的对象来防止循环数据结构。

WeakSets 是此目的的理想选择
// Execute a callback on everything stored inside an object
function execRecursively(fn, subject, _refs = new WeakSet()) {
  // Avoid infinite recursion
  if (_refs.has(subject)) {
    return;
  }

  fn(subject);
  if (typeof subject === "object" && subject) {
    _refs.add(subject);
    for (const key in subject) {
      execRecursively(fn, subject[key], _refs);
    }
    _refs.delete(subject);
  }
}

const foo = {
  foo: "Foo",
  bar: {
    bar: "Bar",
  },
};

foo.bar.baz = foo; // Circular reference!
execRecursively((obj) => console.log(obj), foo);

js

这里,在第一次运行时创建了一个 WeakSet,并与每次后续的函数调用一起传递(使用内部 _refs 参数)。

构造函数

对象的数目或遍历顺序无关紧要,因此对于跟踪对象引用而言,WeakSetSet 更合适(并且性能更高),尤其是在涉及大量对象的情况下。

WeakSet()

实例属性

创建一个新的 WeakSet 对象。

这些属性是在 WeakSet.prototype 上定义的,并由所有 WeakSet 实例共享。

WeakSet.prototype.constructor

创建实例对象的构造函数。对于 WeakSet 实例,初始值为 WeakSet 构造函数。

WeakSet.prototype[Symbol.toStringTag]

实例方法

WeakSet.prototype.add()

[Symbol.toStringTag] 属性的初始值为字符串 "WeakSet"。此属性用于 Object.prototype.toString() 中。

WeakSet.prototype.delete()

value 追加到 WeakSet 对象。

WeakSet.prototype.has()

WeakSet 中删除 valueWeakSet.prototype.has(value) 之后将返回 false

示例

返回一个布尔值,断言 value 是否存在于 WeakSet 对象中。

WeakSets 是此目的的理想选择
const ws = new WeakSet();
const foo = {};
const bar = {};

ws.add(foo);
ws.add(bar);

ws.has(foo); // true
ws.has(bar); // true

ws.delete(foo); // removes foo from the set
ws.has(foo); // false, foo has been removed
ws.has(bar); // true, bar is retained

使用 WeakSet 对象

规范

请注意,foo !== bar。虽然它们是相似的对象,但 *它们不是 **同一个对象** *。因此,它们都被添加到集合中。
规范
# ECMAScript 语言规范

浏览器兼容性

sec-weakset-objects

参见