Why will ES6 WeakMap's not be enumerable?
在我重新进入JavaScript(及相关)之前,我已经完成了很多ActionScript 3,并且那里有一个Dictionary对象,该对象具有弱键,就像即将发布的WeakMap一样。 但是AS3版本仍然像常规通用对象一样可枚举,而WeakMap专门没有.keys()或.values()。
AS3版本允许我们绑定一些非常有趣且有用的结构,但我觉得JS版本有些局限。 这是为什么?
如果Flash VM可以做到,那么是什么阻止浏览器这样做呢? 我读到它将是"不确定的",但这是正确的吗?
-
我认为MDN条目很好地总结了这一点:"由于引用薄弱,因此WeakMap密钥无法枚举(即,没有方法为您提供密钥列表)。如果是,则该列表取决于状态。垃圾收集,引入了不确定性。"不是说不能定义规则,而是通过不允许操作开始于实现(其中有许多竞争)开始可以完全避开该问题。
-
当然,这是有道理的,但它对标准委员会有些微弱(呵呵)。我仍然希望对为什么可枚举并不足够重要而不能成为必需的功能有一些见解。
-
可以,但是要引用MDN:"以防止您使用键数组来保留对键对象的引用,以防止它们被垃圾回收"和"如果要获得键列表,则应自己维护它"。因此,为了获得可枚举性,我使用了WeakMap和一组键。完全取消WeakMap的值。那么我如何拥有大量的弱引用???????
-
@伯恩斯坦你不知道。弱映射旨在用于缓存实现以及类似的事情,在此情况下,应用程序的其他部分会知道映射中可能包含的键。
-
什么?不它不是。这不是关于基本Map的问题,而是一个非常具体的Weakmap问题。引用的项目没有回答问题,就像这里的其他回答一样,它忽略了AS3版本可以很好地使用非确定性的事实。
-
@Pointy键必须是一个对象且不能是原始数据类型的事实,使得在大多数情况下无法将WeakMap用作缓存。 Web缓存使用URL(字符串),DAO类使用OID(整数)作为缓存的键。这两种用例都不可能以对象作为键。
-
@ceving当然,您可以将字符串键包装在String实例中。编辑哦,等等,将无法正常工作。好吧,您可以使用符号。等等,那也行不通。好吧,现在我明白你的意思了:)
-
这是另一个SSO问题,以及最佳答案中的用例解释。
终于找到了真正的答案:http://tc39wiki.calculist.org/es6/weak-map/
A key property of Weak Maps is the inability to enumerate their keys. This is necessary to prevent attackers observing the internal behavior of other systems in the environment which share weakly-mapped objects. Should the number or names of items in the collection be discoverable from the API, even if the values aren't, WeakMap instances might create a side channel where one was previously not available.
-
谢谢。很多。因此它用词不当,应命名为SecretKeyAndWeakMap。参加SE 101的任何人都开始哭泣
-
该答案假定为"在共享弱映射对象的环境中"-但这很常见吗?我从没听说过而且,为什么那是必要的? -如果是的话,只需为WeakMap实例创建自己的弱指针内部特殊集合,正如WeakMap对象确实通过其名称和定义(即其映射的集合)所暗示的那样,因此,如果存在/必须共享,实现WeakMap实例来创建自己的集合似乎没有问题。所以我没有看到这个答案(还?)为什么。
-
这真令人失望。无法枚举弱集合确实限制了其有用性。
-
我不认为这是真的。我认为这更多是关于能够观察GC。如果允许枚举,则WeakMaps会使开发人员面临不确定性的形式,因为他们现在可以在无法访问的atm处观察GC和内存。
这是一个权衡。 如果介绍支持枚举的对象<->对象字典,则有两种与垃圾回收有关的选项:
将键条目视为一个强大的参考,可以防止垃圾回收用作键的对象。
使其成为弱引用,以便每当其他所有引用都消失时,就可以对其键进行垃圾回收。
如果您执行#1操作,您将很容易通过将大物体泄漏到整个内存中来用脚射击自己。 另一方面,如果使用选项#2,则密钥字典将取决于应用程序中垃圾回收的状态,这将不可避免地导致无法跟踪错误。
-
同样,如OP和其他注释中所述:AS3具有仍可枚举的弱键。它工作正常,并允许在不阻止GC的情况下收集/关联值。然后,您可以循环使用密钥来处理尚未收集的密钥。
-
这是非确定性的行为,这是我的解释的案例2,它是创建其他答案中所述的辅助渠道的原因。