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