【问题标题】:Mutability of Typescript interface instances (objects)Typescript 接口实例(对象)的可变性
【发布时间】:2018-08-14 08:14:18
【问题描述】:

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

说我有

interface Foo {
  bar: number
}

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

let x : Foo = { bar: 2 }

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

现在,假设我想更改 bar 的值。我做这两种方式之一。第一种方式:

x = { bar: 5 }

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

第二种方式:

x.bar = 5

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

我相信我的问题的答案是“是”、“是”和“是”。但我想确定一下,因为我对处理过于频繁的垃圾收集感到非常头疼,而且我认为我的代码的许多部分使用“第一种方式”而不是第二种方式这一事实可能是一个很大的促成因素。

【问题讨论】:

    标签: javascript typescript memory


    【解决方案1】:

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

    关于问题 2:x = {bar: 5} 创建了一个新对象,这意味着 x 引用的旧对象可用于垃圾回收 如果 没有其他东西仍然引用 x 的旧对象所指。否则,如果某些东西仍然引用 x 曾经引用的内容,例如:

    let y = x;
    x = {bar: 5};
    

    ...那么用于引用的对象x 将一直存在(因为y 引用它)直到/除非y 不再引用它(因为您为y 分配了不同的值或者因为y 超出范围并且没有被闭包引用)。

    【讨论】:

      猜你喜欢
      • 2021-02-27
      • 1970-01-01
      • 2011-04-17
      • 2017-01-28
      • 2017-08-08
      • 1970-01-01
      • 2020-10-30
      • 2016-08-06
      • 2020-03-06
      相关资源
      最近更新 更多