JavaScript现在具有名为WeakMap
和WeakSet
的类,其中的键很少被引用。
为什么不能重复使用它们的实例,即使用WeakMap#entires
?
注意:这不是重复的问题。另一个问“如何”,这问“为什么”。
答案 0 :(得分:2)
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}`);
}
您希望该程序产生什么?
我们无法确定,因为实际上{ data: 456 }
创建的对象只会在我们的地图中被引用。因此,该条目将由垃圾收集器删除。但是我们不能确定(甚至不太可能)垃圾回收器在对其进行迭代时已将其从地图中删除。另一方面,它可能确实已经将其删除。
该程序将表现出不可预测的行为,因此是不允许的。
答案 1 :(得分:0)
根据docs:
与Map对象的一个区别是WeakMap键不能枚举(即,没有方法可以为您提供键列表)。如果是这样,则该列表将取决于垃圾回收的状态,从而引入不确定性。
此外,WeakMap#entries
将创建对对象的附加引用,从而防止垃圾回收并破坏WeakMap
的目的。