Typescript接口实例(对象)的可变性

roc*_*oco 3 javascript memory typescript

我发现界面非常有用,但是由于内存问题我需要开始优化我的应用程序,我意识到我并不真正了解它们在内部如何工作.

说我有

interface Foo {
  bar: number
}
Run Code Online (Sandbox Code Playgroud)

我用这种类型实例化一些变量:

let x : Foo = { bar: 2 }
Run Code Online (Sandbox Code Playgroud)

Q1:这会创建一个新对象吗?

现在,假设我想改变bar的值.我这样做有两种方式.第一种方式:

x = { bar: 5 }
Run Code Online (Sandbox Code Playgroud)

Q2:这是第一种方式创建一个新对象并替换引用的旧对象x,导致旧对象(with bar = 2)最终被垃圾收集?

第二种方式:

x.bar = 5
Run Code Online (Sandbox Code Playgroud)

问题3:这不是创建一个新对象,而只是更新bar第一个对象(有bar = 2)的值,并避免垃圾收集,因为仍然只有一个对象并且它正在使用中?

我相信我的问题的答案是肯定的,是的,是的.但我想确定,因为我真的很头疼处理过于频繁的垃圾收集,我认为我的代码的许多部分使用"第一路"而不是第二路可能是一个很大的因素.

T.J*_*der 7

您的答案(是,是和是)是正确的.如果你用新的(x = {bar: 5})替换对象很多,那么是的,这意味着垃圾收集器有更多的工作要做x.bar = 5而不是做.

Re Q2:x = {bar: 5}创建一个新对象,意味着如果其他任何东西仍然没有引用所引用的旧对象,则引用的旧对象x可用于垃圾回收.否则,如果某些内容仍然引用了以前引用的内容,例如:xx

let y = x;
x = {bar: 5};
Run Code Online (Sandbox Code Playgroud)

...然后x用于引用的对象将一直存在(因为y引用它)直到/除非y不再引用它(因为您为其分配了不同的值y或因为y超出范围而未被闭包引用) .