32

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

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

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

4

2 回答 2

19

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

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

于 2014-07-14T01:30:16.847 回答
0

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

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

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

如果您执行#1,您将非常容易通过将大对象泄漏到整个地方的内存中来击中自己的脚。另一方面,如果您使用选项#2,您的键字典将依赖于应用程序中垃圾收集的状态,这将不可避免地导致无法追踪错误。

于 2014-06-29T19:42:06.660 回答