【发布时间】:2017-11-07 11:05:09
【问题描述】:
another question 提出了同样的问题,但我无法理解接受的答案。
有问题的库似乎使用Object.defineProperty 来添加对要存储的对象的引用(尽管间接通过另一个对象)。
但是……这肯定意味着对象不能因为这个链接而被垃圾回收吗?
我错过了什么?
真的有可能创建一个对象并将其存储在某个地方而无需维护垃圾收集器注意到的引用吗? (在 ES2015 之前)
接受的答案:
我花了一些时间来摸索代码,但后来它击中了我:关键 本身用于存储对值的引用。
例如,设置好几层就可以了
defProp(obj, globalID, { value: store }); defProp 在哪里 定义为 Object.defineProperty,obj 是 key,globalID 是 guid 和 store 是一个包含值的存储对象。
然后在 get 中查找它的值
obj[globalID];
这很聪明。 WeakMap 实际上并不包含引用 任何东西(弱或其他)——它只是建立了一个政策 秘密存储价值。 Object.defineProperty 的使用意味着 你不会意外发现价值存储——你必须知道 魔法向导来查找它。
由于键直接引用值(而 WeakMap 没有 参考它),当所有对密钥的引用都消失时,它会被 GCed 像平常一样。
【问题讨论】:
-
当然是key引用了value,不然查不到。在键被回收之前,不会对值进行垃圾收集。弱映射的要点是 map 对象 没有对键或值的引用。
标签: javascript weakmap