function f() {
const w = new WeakMap();
const o = {};
w.set(o, { v: o });
return w;
}
const weakMap = f();
对于给定的代码,只有weakMap
项是否被视为可达?因此,它是否会被垃圾回收?
PS:这个问题是从规范的角度提出的,而不是特定实现的角度。
function f() {
const w = new WeakMap();
const o = {};
w.set(o, { v: o });
return w;
}
const weakMap = f();
对于给定的代码,只有weakMap
项是否被视为可达?因此,它是否会被垃圾回收?
PS:这个问题是从规范的角度提出的,而不是特定实现的角度。
引用自WeakMap
对象部分,
如果作为弱引用键值对的键使用的对象只能通过跟随从该WeakMap开始的一系列引用链到达,则该键值对将不可访问,并自动从WeakMap中删除。
在您的情况下,要访问o
唯一的方式就是从weakMap
中的一个键开始,因为没有外部引用。 因此,它将被视为不可访问。
WeakMap实现必须检测并删除这样的键值对以及任何相关资源。
所以,它最终会被垃圾回收。
w
没有引用自身,o
也是如此。 - loganfsmythw
引用了o
和{v:o}
”。听起来我们的分歧在这里:“这意味着链接列表元素包含数据和键,并且它们彼此引用。”我的意思是,键和值并不相互引用,哈希表只是引用了它们两个。这些对象中没有一个包含对彼此的引用。所有对这些对象的引用都在哈希表本身内部。 - Ajedi32