「又是循环引用导致的内存泄漏!」
看着再次崩溃的 Node.js 服务,我陷入了沉思。作为一名前端开发者,在处理稍微复杂的后端逻辑时,总是容易被这类问题困扰。
直到我系统地学习了 WeakMap 和 WeakSet,才发现原来 JavaScript 早已为我们准备了优雅的解决方案。今天,就和大家分享一下这两个ES6引入的“弱”集合类型,它们不仅能有效避免内存泄漏,还在某些场景下能简化我们的代码逻辑。
1. 概念简介:什么是 WeakMap?
与普通的 Map 不同,WeakMap 的键(key)只能是对象(包括数组、函数等引用类型),而不能是原始值(如字符串、数字)。
它的核心特性是“弱引用”:这意味着,如果作为键的对象没有被其他地方引用(即垃圾回收机制认为该对象不可达),那么它会被自动从 WeakMap 中移除,其对应的值也会被垃圾回收。 const wm = new WeakMap();
let obj = { name: "demo" };
// 设置键值对 wm.set(obj, "这是与obj关联的值");
// 获取值 console.log(wm.get(obj)); // 输出: "这是与obj关联的值"
// 删除键值对 wm.delete(obj);