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

Fla*_*nix 8 javascript weakmap ecmascript-6

我一直在使用JavaScript中的WeakMap,在检查文档后,我意识到该clear方法已被弃用/从ECMAScript 6中删除.

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

clear() {
  this._weakmap = new WeakMap()
}
Run Code Online (Sandbox Code Playgroud)

bob*_*bob 9

"弱映射/密钥对值的映射只能由同时具有弱映射和密钥的人来观察或影响.使用clear(),只有WeakMap的人才能够影响WeakMap和键值映射."

马克米勒

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

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

tc39wiki

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

  • 如果clear的功能与创建新的WeakMap的功能相同,那么它将如何引发安全问题?为什么提及可枚举,但明确表示并不意味着可枚举? (2认同)

Sum*_*uma 5

它已被弃用,因为它阻止了WeakMap.

请参阅删除 WeakMap/WeakSet 清除

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

反向实现描述,来自同一来源:

反向实现的设计:

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