为什么 WeakMap 不可互用?

Lol*_*ums 3 javascript ecmascript-6

Javascript 现在有名为WeakMap和 的类WeakSet,其中的键是弱引用的。

为什么这些实例不能被迭代,即使用WeakMap#entires

注意:这不是重复的问题。另一个问“如何”,这个问“为什么”。

idm*_*ean 5

MDN 对此进行了解释

如果是的话,列表将取决于垃圾收集的状态,从而引入非确定性。

但您可能想知道这真正意味着什么。

首先,垃圾收集是不确定的。JavaScript 程序可以由垃圾收集器根据其运行环境自行决定进行垃圾收集。

现在假设我们有以下程序:

const weakMap = new WeakMap();

const key1 = { data: 123 };
weakMap.set(key1, "value");
weakMap.set({ data: 456 }, "value");

for (const [key, value] of weakMap) {  // This does not actually work, of course
  console.log(`${key} is ${value}`);
}
Run Code Online (Sandbox Code Playgroud)

您希望这个程序产生什么结果?

我们无法判断,因为实际上创建的对象{ data: 456 }只会在我们的地图中被引用。所以这个条目将被垃圾收集器删除。但我们无法确定(甚至有点不可能)垃圾收集器在迭代它时已经将其从映射中删除。另一方面,它可能确实已经将其删除了。

该程序会表现出不可预测的行为,因此是不允许的。