## 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.其余章節在哪里?