WeakMap.prototype.set 用于向 WeakMap 添加键值对,键必须是对象(函数、数组等),不能是原始值;它返回 WeakMap 实例本身,支持链式调用,且键被弱引用,无遍历方法。

WeakMap.prototype.set 用于向 WeakMap 实例中添加一个键值对,其中键必须是对象(包括函数、数组、普通对象等),不能是原始值(如字符串、数字、null、undefined 或 symbol)。
键必须是对象类型
WeakMap 的设计初衷是“弱引用”键对象,所以它只接受对象作为键。如果传入原始值,会直接报错:
- ✅ 正确:键是对象、数组、函数、Map、Set、RegExp 等引用类型
- ❌ 错误:键是字符串
"key"、数字42、null、undefined、true、Symbol()
基本用法和语法
调用方式为 weakMap.set(key, value),它返回 WeakMap 实例本身(支持链式调用):
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
const wm = new WeakMap();
const obj = {};
wm.set(obj, "some data"); // ✅ 正确
wm.set({}, "anonymous object"); // ✅ 也合法,但该空对象无其他引用时可能很快被回收
注意 WeakMap 的不可枚举性与限制
WeakMap 不提供遍历方法(没有 keys()、values()、entries()),也无法获取当前键值对数量。它的存在是为了避免内存泄漏,而不是通用存储:
立即学习“Java免费学习笔记(深入)”;
- 无法通过
for...of或forEach遍历 - 不能用
JSON.stringify(wm)序列化 - 键对象一旦失去所有强引用,对应的键值对会自动被垃圾回收(不触发回调)
典型使用场景示例
比如给 DOM 元素附加私有元数据,又不想阻止其被回收:
const elementData = new WeakMap();
function attachMetadata(el, data) {
elementData.set(el, { ...data, createdAt: Date.now() });
}
const btn = document.getElementById("my-btn");
attachMetadata(btn, { role: "submit", version: 2 });
// 后续可通过 btn 获取数据:elementData.get(btn)

















