WeakSet 对象允许你将弱保持对象存储在一个集合中。
语法
new WeakSet([iterable]);
参数
- iterable
- 如果传入一个可迭代对象作为参数, 则该对象的所有迭代值都会被自动添加进生成的
WeakSet对象中。null 被认为是 undefined。
示例
使用 WeakSet对象
var ws = new WeakSet();
var foo = {};
var bar = {};
ws.add(foo);
ws.add(bar);
ws.has(foo); // true
ws.has(bar); // true
ws.delete(foo); // 从set中删除 foo 对象
ws.has(foo); // false, foo 对象已经被删除了
ws.has(bar); // true, bar 依然存在
注意, foo !== bar。 尽管它们是相似的对象,但是它们不是同一个对象。因此,它们都可以被加入到set中。
描述
WeakSet 对象是一些对象值的集合, 并且其中的每个对象值都只能出现一次。在WeakSet的集合中是唯一的
它和 Set 对象的区别有两点:
- 与
Set相比,WeakSet只能是对象的集合,而不能是任何类型的任意值。 WeakSet持弱引用:集合中对象的引用为弱引用。 如果没有其他的对WeakSet中对象的引用,那么这些对象会被当成垃圾回收掉。 这也意味着WeakSet中没有存储当前对象的列表。 正因为这样,WeakSet是不可枚举的。
检测循环引用
递归调用自身的函数需要一种通过跟踪哪些对象已被处理,来应对循环数据结构的方法。
为此,WeakSet非常适合处理这种情况:
// 对 传入的subject对象 内部存储的所有内容执行回调
function execRecursively(fn, subject, _refs = null){
if(!_refs)
_refs = new WeakSet();
// 避免无限递归
if(_refs.has(subject))
return;
fn(subject);
if("object" === typeof subject){
_refs.add(subject);
for(let key in subject)
execRecursively(fn, subject[key], _refs);
}
}
const foo = {
foo: "Foo",
bar: {
bar: "Bar"
}
};
foo.bar.baz = foo; // 循环引用!
execRecursively(obj => console.log(obj), foo);
在此,在第一次运行时创建WeakSet,并将其与每个后续函数调用一起传递(使用内部参数_refs)。 对象的数量或它们的遍历顺序无关紧要,因此,WeakSet比Set更适合(和执行)跟踪对象引用,尤其是在涉及大量对象时。
属性
WeakSet.lengthlength属性的值为 0.WeakSet.prototype- 表示
WeakSet构造函数的原型。 允许向所有WeakSet对象添加属性。
WeakSet 实例
所有 WeakSet 实例都继承自 WeakSet.prototype.
属性
WeakSet.prototype.constructor- 返回构造函数即
WeakSet本身.
方法
WeakSet.prototype.add(value)- 在该
WeakSet对象中添加一个新元素value. WeakSet.prototype.delete(value)- 从该
WeakSet对象中删除value这个元素, 之后WeakSet.prototype.has(value)方法便会返回false. WeakSet.prototype.has(value)- 返回一个布尔值, 表示给定的值
value是否存在于这个WeakSet中.
规范
| 规范链接 | 规范状态 | 备注 |
| ECMAScript 2015 (6th Edition, ECMA-262) WeakSet |
Standard | Initial definition. |
| ECMAScript (ECMA-262) WeakSet |
Living Standard |
浏览器兼容性
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
Update compatibility data on GitHub
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
WeakSet | Chrome Full support 36 | Edge Full support 12 | Firefox Full support 34 | IE No support No | Opera Full support 23 | Safari Full support 9 | WebView Android Full support 37 | Chrome Android Full support 36 | Firefox Android Full support 34 | Opera Android Full support 24 | Safari iOS Full support 9 | Samsung Internet Android Full support 3.0 | nodejs Full support 0.12 |
WeakSet() constructor | Chrome Full support 36 | Edge Full support 12 | Firefox Full support 34 | IE No support No | Opera Full support 23 | Safari Full support 9 | WebView Android Full support 37 | Chrome Android Full support 36 | Firefox Android Full support 34 | Opera Android Full support 24 | Safari iOS Full support 9 | Samsung Internet Android Full support 3.0 | nodejs Full support 0.12 |
add | Chrome Full support 36 | Edge Full support 12 | Firefox Full support 34 | IE No support No | Opera Full support 23 | Safari Full support 9 | WebView Android Full support 37 | Chrome Android Full support 36 | Firefox Android Full support 34 | Opera Android Full support 24 | Safari iOS Full support 9 | Samsung Internet Android Full support 3.0 | nodejs Full support 0.12 |
clear | Chrome No support 36 — 43 | Edge No support No | Firefox No support 34 — 46 | IE No support No | Opera No support 25 — 30 | Safari No support No | WebView Android No support 37 — 43 | Chrome Android No support 36 — 43 | Firefox Android No support 34 — 46 | Opera Android No support 25 — 30 | Safari iOS No support No | Samsung Internet Android No support 3.0 — 4.0 | nodejs No support No |
delete | Chrome Full support 36 | Edge Full support 12 | Firefox Full support 34 | IE No support No | Opera Full support 23 | Safari Full support 9 | WebView Android Full support 37 | Chrome Android Full support 36 | Firefox Android Full support 34 | Opera Android Full support 24 | Safari iOS Full support 9 | Samsung Internet Android Full support 3.0 | nodejs Full support 0.12 |
has | Chrome Full support 36 | Edge Full support 12 | Firefox Full support 34 | IE No support No | Opera Full support 23 | Safari Full support 9 | WebView Android Full support 37 | Chrome Android Full support 36 | Firefox Android Full support 34 | Opera Android Full support 24 | Safari iOS Full support 9 | Samsung Internet Android Full support 3.0 | nodejs Full support 0.12 |
Legend
- Full support
- Full support
- No support
- No support
- Non-standard. Expect poor cross-browser support.
- Non-standard. Expect poor cross-browser support.
- Deprecated. Not for use in new websites.
- Deprecated. Not for use in new websites.