关于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
相关产品推荐
相关产品推荐

