JavaScript中WeakMap与WeakSet使用场景_javascript技巧

夏丽同学_1990

夏丽同学_1990

2025-11-22

210人浏览

原创

WeakMap和WeakSet通过弱引用实现自动内存管理,适用于缓存、私有数据模拟及对象标记场景,避免内存泄漏。

javascript中weakmap与weakset使用场景_javascript技巧

WeakMap 和 WeakSet 是 JavaScript 中两种特殊的集合类型,它们与 Map 和 Set 的主要区别在于对对象的“弱引用”机制。这种特性决定了它们在特定场景下非常有用,但也限制了某些操作。下面介绍它们的核心特点及典型使用场景。

WeakMap 的使用场景

WeakMap 只接受对象作为键,且这些键是“弱引用”的,不会阻止垃圾回收。只要对象被销毁,对应的键值对也会自动从 WeakMap 中清除。

● 缓存对象相关数据

当你想为某些 DOM 元素或对象附加额外信息,但又不希望影响其生命周期时,WeakMap 是理想选择。例如:

const cache = new WeakMap();
function getExpensiveData(obj) {
  if (!cache.has(obj)) {
    cache.set(obj, expensiveComputation(obj));
  }
  return cache.get(obj);
}

一旦 obj 被回收,缓存也随之释放,避免内存泄漏。

● 私有数据模拟

在类中使用 WeakMap 可以实现真正的私有实例字段(在 ES6 class 中尚未原生支持私有属性时常用):

const _data = new WeakMap();
class Person {
  constructor(name) {
    _data.set(this, { name });
  }
  getName() {
    return _data.get(this).name;
  }
}

外部无法直接访问 _data,保证封装性。

WeakSet 的使用场景

WeakSet 只能存储对象,且这些对象是弱引用的。它常用于标记对象或跟踪活动对象。

Java Api Extractor
Java Api Extractor

从 Java 项目中提取 Controller 层接口定义为 JSON 数据。

下载
● 标记活跃对象

比如在事件监听或异步任务中,你想知道某个对象是否正在处理中:

const processing = new WeakSet();
function startProcessing(obj) {
  if (processing.has(obj)) return;
  processing.add(obj);
  // 执行异步操作
  setTimeout(() => {
    processing.delete(obj);
  }, 1000);
}

当 obj 被回收,WeakSet 不会阻止它,也不需要手动清理。

● 防止重复初始化

某些对象只需要初始化一次,可用 WeakSet 记录已初始化的对象:

const initialized = new WeakSet();
function init(obj) {
  if (!initialized.has(obj)) {
    // 设置默认属性或绑定事件
    initialized.add(obj);
  }
}

即使 obj 后续被删除,WeakSet 不会影响其回收。

注意事项与限制

由于弱引用机制,WeakMap 和 WeakSet 不可枚举,也没有 clear() 方法。你不能遍历它们,也无法得知其大小(length 或 size)。这意味着它们不适合用于需要遍历或批量操作的场景。

基本上就这些。WeakMap 和 WeakSet 的价值在于自动内存管理,特别适合做关联数据存储、状态标记和缓存,而不干扰对象的生命周期。用好它们,能有效提升应用的内存安全性和性能。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.17

285

5

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.04

406

5

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.24

375

12

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

2024.01.03

4176

7

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

2025.12.06

306

9

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

2023.09.19

1907

6

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

650

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

343

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

533

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.7万人学习