对于 WeakMap 来说,“循环引用”会被视为“不可访问”,不影响垃圾回收。

11
function f() {
  const w = new WeakMap();
  const o = {};

  w.set(o, { v: o });

  return w;
}

const weakMap = f();

对于给定的代码,只有weakMap项是否被视为可达?因此,它是否会被垃圾回收?

PS:这个问题是从规范的角度提出的,而不是特定实现的角度。


1
它不应该这样。只有具有循环引用的对象才能进行垃圾回收,因此不应该留在weakMap中。 - jfriend00
我是在说它应该被发布,因为它没有外部引用,因此在其他地方无法访问。 - jfriend00
1
我理解你的观点,这个问题本身是合理的,但我个人认为它不应被归类为循环引用,因为 w 没有引用自身,o 也是如此。 - loganfsmyth
1
@zerkms “所以哈希表不仅存储哈希值,还存储原始键”是的,我同意。这就是为什么我说“w引用了o{v:o}”。听起来我们的分歧在这里:“这意味着链接列表元素包含数据和键,并且它们彼此引用。”我的意思是,键和值并不相互引用,哈希表只是引用了它们两个。这些对象中没有一个包含对彼此的引用。所有对这些对象的引用都在哈希表本身内部。 - Ajedi32
1
是的,现在我明白了并且同意它是一个DAG而不是循环图。不过我不确定如何改进主题,因为它已经被放在引号中了。 - zerkms
显示剩余19条评论
1个回答

15

引用自WeakMap对象部分,

如果作为弱引用键值对的键使用的对象只能通过跟随从该WeakMap开始的一系列引用链到达,则该键值对将不可访问,并自动从WeakMap中删除。

在您的情况下,要访问o唯一的方式就是从weakMap中的一个键开始,因为没有外部引用。 因此,它将被视为不可访问。

WeakMap实现必须检测并删除这样的键值对以及任何相关资源。

所以,它最终会被垃圾回收。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接