JavaScript WeakSet
WeakSet 对象
JavaScript 的 WeakSet 是一个值集合,其中 值必须是对象。
WeakSet 持有对其值的 弱引用。
示例
// 创建一个 WeakSet
let mySet = new WeakSet();
// 创建一个对象
let myObj = {fname:"John", lname:"Doe"};
// 添加对象
mySet.add(myObj);
// myObj 是否已添加到 mySet 中?
let answer = mySet.has(myObj);
亲自试一试 »
// 创建一个 WeakSet
let mySet = new WeakSet();
// 创建一个对象
let myObj = {fname:"John", lname:"Doe"};
// 添加对象
mySet.add(myObj);
// 删除对象
mySet.delete(myObj);
// myObj 是否已存在于 mySet 中?
let answer = mySet.has(myObj);
亲自试一试 »垃圾回收
JavaScript 使用一种称为垃圾回收的内存管理机制。
其主要功能包括:
- 确保高效利用内存资源
- 回收不再使用的变量占用的内存
- 防止内存泄漏
弱引用
与普通集合不同,弱集合(WeakSet)并不会阻止其值被垃圾回收。
如果一个值(对象)在程序中没有其他引用,它就会被垃圾回收。
当该值被垃圾回收时,它会从弱集合中移除。
示例
// 创建一个 WeakSet
let mySet = new WeakSet();
// 创建一个对象
let myObj = {fname:"John", lname:"Doe"};
// 添加对象
mySet.add(myObj);
// 从内存中移除对象
myObj = null;
// 现在 mySet 中的 myObj 将被垃圾回收值必须是对象
WeakSet 中不能包含原始类型的值。
值必须是对象。
此限制与垃圾回收机制有关;原始类型的值和对象的垃圾回收方式不同。
追踪对象
弱集合(WeakSet)类似于集合(Set),但它只存储对象,并且以弱引用的方式持有这些对象。如果没有其他引用指向某个对象,它会自动被垃圾回收。
这使得弱集合非常适合追踪对象,而无需存储额外的数据(例如计数)。
追踪访客:
let text = "";
// 创建一个 WeakSet 弱集合来跟踪人员
const persons = new WeakSet();
// 访问对象
const John = {name:"John", age:40};
const Paul = {name:"Paul", age:41};
const Ringo = {name:"Ringo", age:42};
const George = {name:"George", age:43};
// 跟踪访问量
track(Paul);
track(Ringo);
track(Paul);
// 用于跟踪访客的功能
function track(visitor) {
if (persons.has(visitor)) {
text += visitor.name + " is visiting again.<br>";
} else {
persons.add(visitor);
text += visitor.name + ", age" + visitor.age +", is visiting for the first time<br>";
}
}
亲自试一试 »自动清理
如果您移除对访问者对象的所有引用:
跟踪访问者:
John = null;
// John 的条目已从 WeakMap(persons)中移除。不可迭代
弱集合是不可枚举的。
您无法使用 for 循环、forEach() 或 values() 遍历其中的值。
您无法访问其大小。弱集合没有 size 属性。
有限的方法
WeakSet 是一个精简、内存安全的集合,专为私密高效地跟踪对象而设计。
WeakSet 提供了一组有限的方法:
| new WeakSet() | 创建一个新的 WeakSet 对象 |
| add(object) | 向 WeakSet 添加一个对象 |
| delete(object) | 从 WeakSet 中移除一个对象 |
| has(object) | 如果 WeakSet 中存在某个对象,则返回 true |
WeakSet 不具备:
- size 属性
- 扩展运算符 (...)
- clear() 方法
- 任何逻辑方法(并集、差集、交集)
- 任何迭代方法(forEach、keys、values、entries)
以上是设计使然:对象可能会在垃圾回收过程中消失,因此遍历或计数它们毫无意义。
浏览器支持
WeakSet 是 ES6 特性。
自 2017 年 6 月起,所有现代浏览器均已完全支持 ES6。
| Chrome 51 |
Edge 15 |
Firefox 54 |
Safari 10 |
Opera 38 |
| 2016年5月 | 2017年4月 | 2017年6月 | 2016年9月 | 2016年6月 |
