Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Typescript接口实例(对象)的易变性_Javascript_Typescript_Memory - Fatal编程技术网

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
超出了范围,没有被闭包引用)