我一直在JavaScript中使用WeakMap,在查看文档后,我意识到clear
方法已经deprecated / removed from ECMAScript 6。
这是什么原因? 为什么强迫我们做一个明确的功能,如:
clear() {
this._weakmap = new WeakMap()
}
答案 0 :(得分:7)
“只能观察到弱映射/密钥对值的映射或 受同时拥有弱图和密钥的人所影响。同 clear(),只有WeakMap的人才能够影响 WeakMap-and-key-to-value mapping。“
这种限制的原因是安全问题:
弱地图的一个关键属性是无法枚举其键。 这对于防止攻击者观察内部行为是必要的 环境中共享弱映射对象的其他系统。 是否可以发现集合中项目的数量或名称 从API开始,即使值不是,WeakMap实例也可能 创建一个以前无法使用的侧面通道。
可枚举的WeakMap也可能影响GC,因为您可以间接观察GC过程。因此,为了确保可预测的设计,clear
也被删除了。
答案 1 :(得分:3)
不建议使用此方法,因为它可以防止反向实施WeakMap
。
请参见Removal of WeakMap/WeakSet clear。
如果WeakMaps / WeakSets不可检查(通过迭代)并且没有明确的操作,则可以使用反向实现技术。该技术消除了显着的GS复杂性。
来自相同来源的反向实现说明:
为反向实现设计:
每个对象在内部维护一个用于实现WeakMap / Set的表(如果包含多个元素,则可能是一个哈希表)。该表中的条目是一个键/值对,其中键是WeakMap / Set实例。值是任意ES值。让我们将此类表称为“倒置地图”,并通常将此类WeakMaps / Sets称为WC。