WeakMap 和 WeakSet 是 JavaScript 中支持弱引用的集合类型,WeakMap 键必须为对象且不可遍历、无 size,用于私有元数据缓存;WeakSet 仅存对象、不可遍历、无 size,适用于对象状态标记,二者均避免内存泄漏。

WeakMap 和 WeakSet 是 JavaScript 中两种“弱引用”的集合类型,它们的核心特点是:不阻止垃圾回收机制回收其键(WeakMap)或值(WeakSet)所引用的对象。换句话说,只要对象在其他地方不再被强引用,即使它还在 WeakMap 的键里、或 WeakSet 里,也会被自动清理掉。
WeakMap:只接受对象作键的弱引用键值对
WeakMap 类似于 Map,但有三个关键限制:
- 键(key)必须是对象,不能是字符串、数字或 symbol
- 不支持遍历(没有 keys()、values()、entries() 或 forEach)
- 没有 size 属性,无法获知当前有多少条目
这些限制不是缺陷,而是为了配合“弱引用”语义——不让引擎因可枚举、可计数而必须保留内部引用。常见用途包括:给第三方对象“悄悄”附加私有元数据,又不干扰它的生命周期。比如:
const cache = new WeakMap();function getProcessedData(obj) {
if (cache.has(obj)) return cache.get(obj);
const result = expensiveProcess(obj);
cache.set(obj, result); // obj 被弱引用
return result;
}
当 obj 被外部丢弃后,cache 里的这一项会自动消失,不会造成内存泄漏。
立即学习“Java免费学习笔记(深入)”;
WeakSet:只存对象、不可遍历的弱引用集合
WeakSet 类似于 Set,但也有严格限制:
标签: javascript java js 键值对 为什么
还木有评论哦,快来抢沙发吧~