我遇到了在ES5中实现跨浏览器JavaScript libraryWeakMap。 (WeakMap计划用于ES6。)

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

编辑:为了清楚起见,我指的是弱地图,而不是常规地图。我使用Chrome的分析器对该项目进行了测试,并且这些键都不由强引用保留。他们获得了GC,而不必从WeakMap中删除它们。

最佳答案

我花了一段时间查看代码,但随后又打了我:该键本身用于存储对该值的引用。

例如,在set中有几层

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


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

然后在get中向下查找

obj[globalID];

这是非常聪明的。 WeakMap实际上并不包含对任何东西的引用(弱或其他),它只是设置了一个秘密存储值的策略。使用Object.defineProperty意味着您不会偶然发现值存储-您必须知道魔术指导才能对其进行查找。

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

10-02 01:30