10

I have been working with WeakMaps in JavaScript, and after checking the documentation I realized that the clear method has been deprecated / removed from ECMAScript 6.

What is the reason for this? Why force us to do a clear function like:

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

2 回答 2

7

“弱图/密钥对值的映射只能由同时拥有弱图和密钥的人观察或影响。使用 clear(),只有 WeakMap 的人将能够影响 WeakMap-and-key-to-value 映射。”</p>

马克·米勒

这种限制的原因是出于安全考虑:

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

tc39wiki

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

于 2016-05-30T14:56:35.573 回答
4

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

请参阅删除 WeakMap/WeakSet clear

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

倒置的实现描述,来自同一来源:

反向实现的设计:

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

于 2020-02-20T16:38:56.157 回答