You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于WeakMap直接传入对象字面量的垃圾回收疑问及澄清

WeakMap与垃圾回收的常见疑问解答

核心特性回顾

WeakMap的键只能是对象,且对这些对象持有的是弱引用。这意味着:当某个对象不再有任何强引用时,垃圾回收器会自动回收该对象,同时WeakMap中对应的键值对也会被移除。

第一个场景的解释

看这段代码:

let object1 = { name: "A" };
const map1 = new WeakMap();
map1.set(object1, "Apple");
console.log(map1.has(object1)); // true
object1 = null; // now garbage collector will remove the object from WeakMap
  • 初始时object1是{ name: "A" }这个对象的强引用,WeakMap仅持有它的弱引用;
  • 当执行object1 = null后,该对象失去了所有强引用,垃圾回收器运行时就会回收这个对象,同时WeakMap里对应的键值对也会被清理。

关于对象字面量传入WeakMap的疑问解答

你提到的这段代码:

map1.set({ name: "D" }, "Direct");
//Why map accept this param, although no reference for it

首先WeakMap允许传入这样的参数,因为它只要求键是对象,不管有没有其他引用。而你之前的误解(以为对象不会被移除)是错误的——这个对象字面量同样会被垃圾回收器移除。

原因很简单:这个对象字面量没有任何强引用,只有WeakMap持有的弱引用。一旦垃圾回收器触发,这个对象就会被回收,WeakMap里的这个键值对也会随之消失。你没法通过map1.has()验证这一点,因为你根本没有保存这个对象的引用,但它确实会被清理。


内容的提问来源于stack exchange,提问作者Anonumouz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:48:22