为什么ES6 WeakMap不可枚举?

时间:2013-12-11 01:07:29

标签: javascript ecmascript-6 enumerable weakmap

在我重新进入JavaScript(以及相关)之前,我已经完成了很多ActionScript 3,并且在那里他们有一个具有弱键的Dictionary对象,就像即将发布的WeakMap一样;但AS3版本仍然像常规通用对象一样可枚举,而WeakMap特别没有.keys().values()

AS3版本允许我们安装一些非常有趣和有用的构造,但我觉得JS版本有些限制。这是为什么?

如果Flash VM可以做到这一点,那么是什么阻止浏览器做同样的事情呢?我读到了它是如何“非确定性”的,但这有点正确吗?

2 个答案:

答案 0 :(得分:16)

终于找到了真正的答案:http://tc39wiki.calculist.org/es6/weak-map/

  

弱地图的一个关键属性是无法枚举其键。这对于防止攻击者观察共享弱映射对象的环境中其他系统的内部行为是必要的。如果集合中的项目的数量或名称可以从API中发现,即使值不是,WeakMap实例也可能创建一个以前不可用的侧面通道。

答案 1 :(得分:-1)

这是一个权衡。如果你介绍对象< - >支持可枚举性的对象字典,您有两个与垃圾收集相关的选项:

  1. 将密钥条目视为强引用,以防止对象的垃圾收集被用作密钥。

  2. 使其成为一个弱引用,只要其他所有引用都消失,就可以对其密钥进行垃圾回收。

  3. 如果你做#1,那么你可以通过将大型物体泄漏到整个存储器内来让自己在脚下拍摄变得非常容易。另一方面,如果使用选项#2,您的密钥字典将依赖于应用程序中的垃圾收集状态,这将不可避免地导致无法追踪错误。