导航
×
   ❮   
HTML CSS JavaScript PHP Go ECMS

JavaScript 教程

JS 简介 JS 如何使用 JS 输出 JS 语法 JS 语句 JS 注释 JS 变量 JS 运算符 JS 条件语句 JS 循环 JS 字符串 JS 数字 JS 函数 JS 对象 JS 日期 JS 数组 JS 类型化数组 JS 集合 JS Map 映射 JS Math JS 正则表达式 JS 数据类型 JS 错误 JS 事件 JS 编程 JS 关键字参考 JS 保留关键字参考 JS 运算符参考 JS 运算符优先级 JS UTF-8 字符 JS UTF-8 符号 JS UTF-8 表情符号 JS 版本

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>";
  }
}
亲自试一试 »

注意

如果您也想统计访问量:

请尝试使用 Wea​​kMap

自动清理

如果您移除对访问者对象的所有引用:

跟踪访问者:

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)

以上是设计使然:对象可能会在垃圾回收过程中消失,因此遍历或计数它们毫无意义。



浏览器支持

WeakSetES6 特性

自 2017 年 6 月起,所有现代浏览器均已完全支持 ES6。

         
Chrome
51
Edge
15
Firefox
54
Safari
10
Opera
38
2016年5月 2017年4月 2017年6月 2016年9月 2016年6月

freew3c.com 中文网是独立运营的中文开发者学习平台,与 freew3c.com 无关联。提供的内容仅用于学习和测试,不保证内容的正确性。


Copyright @2020-2026 京ICP备888888号-8