我遇到了在ES5中实现跨浏览器JavaScript library的WeakMap。 (WeakMap计划用于ES6。)
没有JavaScript语言本身的支持,这怎么可能工作?
编辑:为了清楚起见,我指的是弱地图,而不是常规地图。我使用Chrome的分析器对该项目进行了测试,并且这些键都不由强引用保留。他们获得了GC,而不必从WeakMap中删除它们。
最佳答案
我花了一段时间查看代码,但随后又打了我:该键本身用于存储对该值的引用。
例如,在set
中有几层
defProp(obj, globalID, { value: store });
其中
defProp
已定义为Object.defineProperty
,obj
是键,globalID
是guid,store
是包含该值的存储对象。然后在
get
中向下查找obj[globalID];
这是非常聪明的。 WeakMap实际上并不包含对任何东西的引用(弱或其他),它只是设置了一个秘密存储值的策略。使用
Object.defineProperty
意味着您不会偶然发现值存储-您必须知道魔术指导才能对其进行查找。由于键直接引用值(而WeakMap并不引用该值),所以当所有对键的引用都消失时,它会像平常一样被GC。