为什么WeakMap的clear()方法被弃用了?

12
我一直在使用JavaScript中的WeakMap,在查看文档后,我意识到clear方法已被弃用/从ECMAScript 6中删除
这是为什么呢? 为什么要强制我们做一个类似于清除函数的东西呢?
clear() {
  this._weakmap = new WeakMap()
}
2个回答

9
“The mapping from weakmap/key pair value can only be observed or affected by someone who has both the WeakMap and the key. With clear(), someone with only the WeakMap would’ve been able to affect the WeakMap-and-key-to-value mapping.” 这种限制的原因是出于安全考虑:
弱映射的一个重要特性是无法枚举其键名。这是为了防止攻击者观察其他共享弱映射对象的系统的内部行为所必需的。如果可以从API中发现集合中的项目数量或名称,即使不能得到值,弱映射实例也可能会创建先前不可用的侧信道。 Mark Miller tc39wiki 一种可枚举的 WeakMap 可能也会影响 GC(垃圾回收),因为它可以间接地观察 GC 过程。因此,为了确保可预测的设计,clear 也被删除了。

9
如果clear在功能上与创建新的WeakMap是完全相同的,那么它如何引起安全问题?为什么要提到可枚举性,当clear并不意味着它? 如果'clear'與創建新的'WeaKMap'在功能上沒有區別,那麼它怎麼會引起任何安全問題?為什麼要提到可枚舉性,當清除並不暗示它? - riv

5

这是因为它防止了WeakMap的反向实现。

请参见删除WeakMap/WeakSet的Clear方法

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

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

设计反向实现:

每个对象内部维护一个表(如果包含多个元素,则可能是哈希表),用于实现WeakMap/Set。表中的条目是键/值对,其中键是WeakMap/Set实例。值是任意ES值。让我们称这样的表为“反转映射”,通称这样的WeakMaps/Sets为WCs。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接