## 33\. WeakSets(`WeakSet`)
> 原文: [http://exploringjs.com/impatient-js/ch_weaksets.html](http://exploringjs.com/impatient-js/ch_weaksets.html)
WeakSets 与 Sets 类似,但有以下区别:
* 它们可以保存对象,而不会阻止这些对象被垃圾收集。
* 它们是黑盒子:如果你同时拥有 WeakSet 和一个值,你只能从 WeakSet 中获取任何数据。支持的唯一方法是`.add()`,`.delete()`,`.has()`。有关为什么 WeakSets 不允许迭代,循环和清除的原因,请参考 [WeakMaps 部分作为黑盒](ch_weakmaps.html#weakmaps-as-black-boxes)。
鉴于您无法迭代其元素,WeakSets 的用例并不多。它们可以让您标记对象。
### 33.1。示例:将对象标记为可以安全使用方法
[Domenic Denicola 显示](https://mail.mozilla.org/pipermail/es-discuss/2015-June/043027.html)类`Foo`如何确保其方法仅应用于由它创建的实例:
```js
const foos = new WeakSet();
class Foo {
constructor() {
foos.add(this);
}
method() {
if (!foos.has(this)) {
throw new TypeError('Incompatible object!');
}
}
}
const foo = new Foo();
foo.method(); // works
assert.throws(
() => {
const obj = {};
Foo.prototype.method.call(obj); // throws an exception
},
TypeError
);
```
### 33.2。 WeakSet API
`WeakSet`的构造函数和三种方法与[的`Set`等价物](ch_sets.html#quickref-sets)的作用相同:
* `new WeakSet<T>(values?: Iterable<T>)` <sup>[ES6]</sup>
* `.add(value: T): this` <sup>[ES6]</sup>
* `.delete(value: T): boolean` <sup>[ES6]</sup>
* `.has(value: T): boolean` <sup>[ES6]</sup>
- I.背景
- 1.关于本书(ES2019 版)
- 2.常见问题:本书
- 3. JavaScript 的历史和演变
- 4.常见问题:JavaScript
- II.第一步
- 5.概览
- 6.语法
- 7.在控制台上打印信息(console.*)
- 8.断言 API
- 9.测验和练习入门
- III.变量和值
- 10.变量和赋值
- 11.值
- 12.运算符
- IV.原始值
- 13.非值undefined和null
- 14.布尔值
- 15.数字
- 16. Math
- 17. Unicode - 简要介绍(高级)
- 18.字符串
- 19.使用模板字面值和标记模板
- 20.符号
- V.控制流和数据流
- 21.控制流语句
- 22.异常处理
- 23.可调用值
- VI.模块化
- 24.模块
- 25.单个对象
- 26.原型链和类
- 七.集合
- 27.同步迭代
- 28.数组(Array)
- 29.类型化数组:处理二进制数据(高级)
- 30.映射(Map)
- 31. WeakMaps(WeakMap)
- 32.集(Set)
- 33. WeakSets(WeakSet)
- 34.解构
- 35.同步生成器(高级)
- 八.异步
- 36. JavaScript 中的异步编程
- 37.异步编程的 Promise
- 38.异步函数
- IX.更多标准库
- 39.正则表达式(RegExp)
- 40.日期(Date)
- 41.创建和解析 JSON(JSON)
- 42.其余章节在哪里?