Javascript Typescript接口实例(对象)的易变性
我发现界面非常有用,但由于内存问题,我需要开始优化我的应用程序,我意识到我并不真正理解它们在内部是如何工作的 说我有Javascript Typescript接口实例(对象)的易变性,javascript,typescript,memory,Javascript,Typescript,Memory,我发现界面非常有用,但由于内存问题,我需要开始优化我的应用程序,我意识到我并不真正理解它们在内部是如何工作的 说我有 interface Foo { bar: number } 我用以下类型实例化了一些变量: let x : Foo = { bar: 2 } Q1:这会创建新对象吗 现在,假设我想更改bar的值。我有两种方法。第一种方式: x = { bar: 5 } Q2:第一种方法是否创建新对象并替换x引用的旧对象,从而导致旧对象(具有bar=2)最终被垃圾收集 第二种方式: x.
interface Foo {
bar: number
}
我用以下类型实例化了一些变量:
let x : Foo = { bar: 2 }
Q1:这会创建新对象吗
现在,假设我想更改bar的值。我有两种方法。第一种方式:
x = { bar: 5 }
Q2:第一种方法是否创建新对象并替换x
引用的旧对象,从而导致旧对象(具有bar=2
)最终被垃圾收集
第二种方式:
x.bar = 5
Q3:这是否不会创建新对象,而只是更新第一个对象中bar
的值(该对象具有bar=2
),并避免垃圾收集,因为仍然只有一个对象且它正在使用
我相信我的问题的答案是肯定的,肯定的,肯定的。但是我想确定一下,因为我在处理过于频繁的垃圾收集时真的很头疼,而且我认为我的代码的许多部分使用“第一种方式”而不是第二种方式这一事实可能是一个很大的原因。您的答案(是、是、是)是正确的。如果您正在用新对象(x={bar:5}
)替换批对象,那么是的,这将意味着垃圾收集器比执行x.bar=5
有更多的工作要做
Re Q2:x={bar:5}
创建一个新对象,表示x
引用的旧对象可用于垃圾收集,前提是x
引用的旧对象仍然没有引用。否则,如果某物仍然引用了x
用来引用的内容,例如:
let y = x;
x = {bar: 5};
…然后,用于引用的对象x
将继续存在(因为y
引用了它),直到/除非y
不再引用它(因为您为y
指定了不同的值,或者因为y
超出了范围,没有被闭包引用)