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

Esq*_*uth 1 javascript siblings circular-reference node.js typescript

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

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
Run Code Online (Sandbox Code Playgroud)

还是我应该使孩子和兄弟姐妹变量可选,并添加一个destructor?像这样:

kids?: Kid[];
siblings?: Kid[];
destructor() {
    this.kids = undefined
}
Run Code Online (Sandbox Code Playgroud)

这是一个相关的主题,我对答案不满意:销毁打字稿中的循环引用实例?

Rya*_*ugh 7

TypeScript没有运行时。

JavaScript有许多运行时,因此不可能说所有这些运行时都适用,但是所有主要运行时(流行浏览器中附带的运行时,node.js)都能够轻松处理断开的循环引用。

JS中有一个定义明确的内存根,通过它可以很容易地进行标记扫掠GC,在处理循环引用时没有问题。循环引用实际上只是引用计数的GC系统中的一个问题,由于您不需要确定性的清理,因此没有充分的理由使用JS语言进行引用计数。