EcmaScript5中的WeakMap实现

WeakMap implementation in EcmaScript5?

本文关键字:实现 WeakMap 中的 EcmaScript5      更新时间:2023-09-26

我遇到了一个JavaScript库,它在ES5中实现了跨浏览器的WeakMap。(WeakMap被指定为ES6)

如果没有JavaScript语言本身的支持,这怎么可能工作?

编辑:为了明确,我指的是映射,而不是常规映射。我用Chrome的分析器测试了这个项目,键不是由强引用持有的。它们无需从WeakMap中删除就可以被GC化。

我花了一段时间来理解代码,但后来我突然想到:键本身是用来存储对值的引用的

例如,在set中有几层

defProp(obj, globalID, { value: store });

其中defProp定义为Object.defineProperty, obj为键,globalID为guid, store为包含该值的存储对象。

然后在get中,它用

查找值

obj[globalID];

这很聪明。WeakMap实际上并不包含对任何东西(弱或其他)的引用——它只是设置了一个策略,在哪里秘密存储值。使用Object.defineProperty意味着您不会意外地发现值存储——您必须知道查找它的魔法向导。

由于键直接引用值(而WeakMap不引用它),当所有对键的引用都消失时,它会像正常一样被GCed。