从 EcmaScript 使用 WeakMap 时的时间问题注意事项
Timing issues considerations when using WeakMap from EcmaScript
JavaScript中 WeakMap 的正确用法是什么?使用时可能会出现什么样的时序问题?特别是,我想知道在以下情况下会发生什么:
var wm1 = new WeakMap()
var o1 = {},
o2 = function(){},
o3 = window;
// in other method:
wm1.set(o1, 37);
wm1.set(o2, "azerty");
if (wm1.has(o2)) {
//Garbage collection happen here, objects from wm1 may no longer exists
Console.log(wm1.get(o2)) // what will happen here? just undefined? null?
}
GC 将如何影响 WeakMaps?
更新:糟糕,我错过了在 WeakMap 中不能将字符串作为键的事实,如果我考虑到这一事实,我的问题就不会提出。
WeakMap
s 明确设计为不表现出最不明显的垃圾收集行为。绝对零问题。
在您的特定情况下,只要您持有对对象或函数的引用(通过仍在堆栈中的活动变量 o1
和 o2
),您将能够在 WeakMap
或 WeakSet
中找到它们。一旦您不再持有对它们的引用,并且没有人持有,它们就有资格进行垃圾收集(就像往常一样)——鉴于此,没有人能够尝试在集合中查找它们。
JavaScript中 WeakMap 的正确用法是什么?使用时可能会出现什么样的时序问题?特别是,我想知道在以下情况下会发生什么:
var wm1 = new WeakMap()
var o1 = {},
o2 = function(){},
o3 = window;
// in other method:
wm1.set(o1, 37);
wm1.set(o2, "azerty");
if (wm1.has(o2)) {
//Garbage collection happen here, objects from wm1 may no longer exists
Console.log(wm1.get(o2)) // what will happen here? just undefined? null?
}
GC 将如何影响 WeakMaps?
更新:糟糕,我错过了在 WeakMap 中不能将字符串作为键的事实,如果我考虑到这一事实,我的问题就不会提出。
WeakMap
s 明确设计为不表现出最不明显的垃圾收集行为。绝对零问题。
在您的特定情况下,只要您持有对对象或函数的引用(通过仍在堆栈中的活动变量 o1
和 o2
),您将能够在 WeakMap
或 WeakSet
中找到它们。一旦您不再持有对它们的引用,并且没有人持有,它们就有资格进行垃圾收集(就像往常一样)——鉴于此,没有人能够尝试在集合中查找它们。