为什么 ES6 弱图不可枚举?



在我重新进入JavaScript(及相关)之前,我已经做了很多ActionScript3,他们有一个Dictionary对象,它有弱键,就像即将推出的WeakMap一样;但AS3版本仍然像常规的泛型对象一样是可枚举的,而WeakMap特别没有CCD_ 1或CCD_。

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

如果Flash虚拟机可以做到这一点,那么是什么阻止浏览器做同样的事情呢?我读到它是如何"不确定性"的,但这是一点,对吧?

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

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

这是一个折衷方案。如果您引入对象<->支持枚举性的对象字典,您有两个与垃圾收集相关的选项:

  1. 将键条目视为一个强引用,可防止对用作键的对象进行垃圾回收。

  2. 使它成为一个弱引用,每当其他引用都消失时,它的键就会被垃圾收集。

如果你做到了第1点,你会非常容易地通过将大型物体泄漏到各处的内存中来射中自己的脚。另一方面,如果使用选项#2,则密钥字典将依赖于应用程序中垃圾收集的状态,这将不可避免地导致无法跟踪错误。

最新更新