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

3

我发现接口非常有用,但由于内存问题需要开始优化我的应用程序,我意识到我实际上不太了解它们在内部是如何工作的。

比如说,我有

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),并避免垃圾回收,因为仍然只有一个对象在使用吗?
我相信我的问题的答案都是肯定的,但我想要确定一下,因为我正在处理频繁的垃圾回收问题,我认为我的代码中许多部分使用了“第一种方式”,而不是第二种方式,可能是一个重要的贡献因素。
1个回答

7
你的回答(是,是,和是)都是正确的。如果你经常用新对象替换对象(x = {bar: 5}),那么相比使用x.bar = 5,垃圾收集器需要做更多的工作。
关于问题2: x = {bar: 5} 创建一个新对象,并且意味着旧对象被垃圾收集器回收,前提是没有其他东西引用了x原来所指向的旧对象。否则,如果仍有其他东西引用了x原来所指向的对象,例如:
let y = x;
x = {bar: 5};

如果对象x被引用,则它会一直存在(因为y引用它),直到y不再引用它(因为你给y赋了一个不同的值或者y超出范围并且没有被闭包引用)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接