Typescript / Javascript 垃圾收集器是处理循环引用还是泄漏内存?

Does Typescript / Javascript garbage collector handle circular references or does it leak memory?

在像 C# 这样的语言中这不是问题,但是这会导致在其他一些语言中很难找到内存错误。我可以在 TypescriptJavascript 中使用以下代码并相信一切都会好起来吗?

class Dad {
    kids: Kid[];
}
class Kid {
    dad: Dad;
    siblings: Kid[];
}

let anakin: Dad | undefined;

function makeKids(dad: Dad) {
    const luke = new Kid();
    const leia = new Kid();
    luke.dad = dad;
    leia.dad = dad;
    luke.siblings = [leia];
    leia.siblings = [luke];
    dad.kids = [luke, leia];
}

anakin = new Dad();
makeKids(anakin);
console.log(anakin.kids.length); // Prints out 2
anakin = undefined;
// I expect luke and leia to die at this point
// Not float around the memory space infinitely

或者我应该将变量 kids 和 siblings 设为可选并添加一个 destructor?像这样:

kids?: Kid[];
siblings?: Kid[];
destructor() {
    this.kids = undefined
}

这是一个相关主题,我对答案不满意:

TypeScript 没有运行时。

有很多 JavaScript 运行时,所以不可能说 所有 某些特定的东西都是真的,但是所有主要的运行时(那些在流行的浏览器,node.js) 很容易处理断开连接的循环引用。

JS中有一个定义明确的内存根,可以很容易地进行标记清除GC,处理循环引用没有问题。循环引用实际上只是 ref-counted GC 系统中的一个问题,没有很好的理由在 JS 语言中进行 ref 计数,因为您不需要确定性清理。