我遇到了在{strong> ES5 中实现跨浏览器JavaScript library的WeakMap。 (WeakMap定于 ES6 。)
如果没有JavaScript语言本身的支持,这怎么可能有效呢?
编辑:为了清楚起见,我指的是弱地图,而不是常规地图。我使用Chrome的分析器测试了这个项目,并且密钥不是由强引用来保存的。他们得到了GC,而不必从WeakMap中删除它们。
答案 0 :(得分:33)
我花了一段时间来查看代码,但随后它发现了我:密钥本身用于存储对值的引用。
例如,set
中有几个图层可以
defProp(obj, globalID, { value: store });
其中defProp
已定义为Object.defineProperty
,obj
是关键,globalID
是guid,store
是包含值。
然后在get
中向下查找
obj[globalID];
这很聪明。 WeakMap实际上并不包含对任何内容的引用(弱或其他) - 它只是建立了一个秘密存储值的策略。使用Object.defineProperty
意味着您不会意外地发现价值存储 - 您必须知道查找它的神奇指导。
由于键直接引用了值(并且WeakMap没有引用它),当对键的所有引用都消失后,它会像正常一样得到GC。