Lol*_*ums 3 javascript ecmascript-6
Javascript 现在有名为WeakMap和 的类WeakSet,其中的键是弱引用的。
为什么这些实例不能被迭代,即使用WeakMap#entires?
注意:这不是重复的问题。另一个问“如何”,这个问“为什么”。
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 }只会在我们的地图中被引用。所以这个条目将被垃圾收集器删除。但我们无法确定(甚至有点不可能)垃圾收集器在迭代它时已经将其从映射中删除。另一方面,它可能确实已经将其删除了。
该程序会表现出不可预测的行为,因此是不允许的。
| 归档时间: |
|
| 查看次数: |
1348 次 |
| 最近记录: |