为什么不推荐使用WeakMap clear()方法?

时间:2016-05-30 14:54:37

标签: javascript ecmascript-6 weakmap

我一直在JavaScript中使用WeakMap,在查看文档后,我意识到clear方法已经deprecated / removed from ECMAScript 6

这是什么原因? 为什么强迫我们做一个明确的功能,如:

clear() {
  this._weakmap = new WeakMap()
}

2 个答案:

答案 0 :(得分:7)

  

“只能观察到弱映射/密钥对值的映射或   受同时拥有弱图和密钥的人所影响。同   clear(),只有WeakMap的人才能够影响   WeakMap-and-key-to-value mapping。“

Mark Miller

这种限制的原因是安全问题:

  

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

tc39wiki

可枚举的WeakMap也可能影响GC,因为您可以间接观察GC过程。因此,为了确保可预测的设计,clear也被删除了。

答案 1 :(得分:3)

不建议使用此方法,因为它可以防止反向实施WeakMap

请参见Removal of WeakMap/WeakSet clear

如果WeakMaps / WeakSets不可检查(通过迭代)并且没有明确的操作,则可以使用反向实现技术。该技术消除了显着的GS复杂性。

来自相同来源的反向实现说明:

为反向实现设计:

每个对象在内部维护一个用于实现WeakMap / Set的表(如果包含多个元素,则可能是一个哈希表)。该表中的条目是一个键/值对,其中键是WeakMap / Set实例。值是任意ES值。让我们将此类表称为“倒置地图”,并通常将此类WeakMaps / Sets称为WC。