WeakSet
基线 广泛可用
此功能非常成熟,可以在许多设备和浏览器版本中使用。它自 2015 年 9 月.
报告反馈
描述
**注意:** 这也意味着没有存储在集合中的当前值的列表。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
参数)。
构造函数
实例属性
创建一个新的 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
中删除value
。WeakSet.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