Javascript 为什么弱贴图不可交互?

Javascript 为什么弱贴图不可交互?,javascript,ecmascript-6,Javascript,Ecmascript 6,Javascript现在有名为WeakMap和WeakSet的类,其中键被弱引用 为什么不能迭代这些实例,即使用WeakMap#entires 注意:这不是一个重复的问题。另一个问“如何”,这问“为什么”。根据: 映射对象的一个区别是WeakMap键不可枚举(即,并没有方法提供键列表)。如果是,则列表将取决于垃圾收集的状态,从而引入非确定性 另外,WeakMap#条目将创建对对象的额外引用,从而防止垃圾收集并破坏WeakMap的用途。

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

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

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

根据:

映射对象的一个区别是WeakMap键不可枚举(即,并没有方法提供键列表)。如果是,则列表将取决于垃圾收集的状态,从而引入非确定性


另外,
WeakMap#条目
将创建对对象的额外引用,从而防止垃圾收集并破坏
WeakMap
的用途。

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

但你可能想知道这到底意味着什么

首先,垃圾收集是不确定的。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}
创建的对象只会在我们的地图中被引用。所以这个条目将被垃圾收集器删除。但我们不能确定(甚至有点不太可能)垃圾收集器在对其进行迭代时是否已将其从映射中删除。另一方面,它可能确实已经移除了它


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

@bergi此问题不是重复的。你链接的一个问“如何”,我的问“为什么”-注意链接的答案并不能解释“为什么”。你使用的是你不想让这些对象保持活力的弱结构,也就是说,如果它们还活着,你就把它们放在一组中,但你不在乎它们是否活着。迭代意味着您确实关心。那里有一种自然的紧张气氛。同时允许这两个选项可能会导致错误。@Lolums抱歉,链接错误。更合适。这些额外的引用难道不是弱引用吗?看起来JavaScript在将来最终将得到一个真正的WeakReference实现!通过将两者结合起来,这将实现一个可移植的WeakMap。(为WeakMap中的每个键创建一个WeakRefs数组,然后通过迭代键并将每个键与in-WeakMap值组合进行迭代)