23

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

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

编辑:为了清楚起见,我指的是地图,而不是常规地图。我使用 Chrome 的分析器测试了这个项目,并且密钥不是由强引用持有的。他们无需从 WeakMap 中删除即可获得 GC。

4

1 回答 1

37

我花了一些时间来摸索代码,但后来它击中了我:键本身用于存储对值的引用。

例如,它的几层set确实

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

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

然后向下get查找值

obj[globalID];

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

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

于 2013-05-03T21:35:37.127 回答