跳到主要内容

JS WeakMap 与 WeakSet

WeakMapWeakSet 是 JavaScript 中专门为弱引用对象设计的集合类型。它们与 MapSet 类似,但主要用于 节省内存、避免内存泄漏


WeakMap

特点

  • 只能将 对象 作为键(键必须是对象,不能是原始值)
  • 键是弱引用:当对象不再被引用时,会自动被垃圾回收
  • 不可遍历(没有 forEachsize 等)

基本用法

js
const wm = new WeakMap();

const obj = { name: "Alice" };
wm.set(obj, "some data");

console.log(wm.get(obj)); // "some data"
console.log(wm.has(obj)); // true

// 删除
wm.delete(obj);

使用场景

  • 私有数据存储:给对象绑定额外信息而不影响垃圾回收。
js
const privateData = new WeakMap();

class User {
constructor(name) {
privateData.set(this, { id: Math.random() });
this.name = name;
}
getId() {
return privateData.get(this).id;
}
}

const u1 = new User("Alice");
console.log(u1.getId());

WeakSet

特点

  • 元素必须是对象
  • 弱引用,不影响垃圾回收
  • 不可遍历(没有 forEachsize

基本用法

js
const ws = new WeakSet();

const obj1 = { id: 1 };
const obj2 = { id: 2 };

ws.add(obj1);
ws.add(obj2);

console.log(ws.has(obj1)); // true
ws.delete(obj2);

使用场景

  • 用于 标记对象状态(如是否已处理)
js
const processed = new WeakSet();

function process(item) {
if (processed.has(item)) return;
console.log("Processing:", item);
processed.add(item);
}

const a = {}, b = {};
process(a); // Processing: {}
process(a); // 不再处理

WeakMap vs WeakSet

特性WeakMapWeakSet
存储内容键值对(键为对象)对象集合
是否弱引用是(键弱引用)是(值弱引用)
是否可遍历
应用场景缓存、私有属性、元数据对象标记、跟踪状态