我遇到了一个在ES5中实现跨浏览器WeakMap的JavaScript 库。(WeakMap 计划用于ES6。)
如果没有 JavaScript 语言本身的支持,这怎么可能工作?
编辑:为了清楚起见,我指的是弱地图,而不是常规地图。我使用 Chrome 的分析器测试了这个项目,并且密钥不是由强引用持有的。他们无需从 WeakMap 中删除即可获得 GC。
我遇到了一个在ES5中实现跨浏览器WeakMap的JavaScript 库。(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 不引用它),当所有对键的引用都消失时,它会像往常一样进行 GC。