【问题标题】:When object variable is reassigned in Javascript, what happens to the original object?当在Javascript中重新分配对象变量时,原始对象会发生什么?
【发布时间】:2016-05-14 21:06:18
【问题描述】:

让我们在一开始就说:

class AI {
// class properties/methods here
}
var chappie = new AI;

然后在使用变量之后,如果我想通过调用来重置它:

chappie = new AI;

原始对象会发生什么?它会收集垃圾吗?这是允许的,还是有更好的方法来“重置”变量?

【问题讨论】:

  • 除非有另一个引用,否则它会被 GC 删除。这是删除不需要的内存分配的公认方法。调用解除引用。
  • 取决于您所说的“重置”。您将创建一个新对象并将其分配给该变量。但是,如果您只想丢弃前一个对象,请将变量设置为 null 并且不要创建新对象。有点不清楚你的意图是什么。
  • “有没有更好的方法” ...如果您只想覆盖原始文件,可能不会

标签: javascript class variables object declaration


【解决方案1】:

如果不再有对某个对象的引用,那么该对象最终将被垃圾回收。

如果您最初有 1 个引用,而现在没有,最终内存将被释放。

var obj = { };
var a = obj;
var b = obj;
a = null;

还有一个参考,所以没有任何变化。

至于另一个问题:“我还要如何重置变量?” 我的后续问题是“为什么?”

如果您希望 GC 启动,则可以将 var 设置为 nullundefined 或其他任何值(假设这是最后一次引用该对象)。

...否则,当任何东西不再需要 var 时,GC 也会自行清理 var。 如果被删除的 var 是对某个值的最后引用,则该值将被清除。

【讨论】:

  • 变量在超出范围之前不会被删除。最好使用undefined 而不是null,因为 undefined 比 null 具有更有意义的上下文含义。 null 也被序列化为 JSON,undefined 被忽略。
  • @Blindman67: null 的意思是“没有对象”,这正是这里的首选。
  • @Bergi null 是一个占位符。这意味着目前该变量没有适用的值,但我们希望保留(保留)该变量以防将来需要。未定义是字面意思,指的是不存在的未定义实体。分配它以指示不再需要该变量并且它不再具有有意义的上下文。在序列化/传输/克隆期间,必须保留值为 null 的变量,这与可以转储的未定义变量不同。如果您没有进一步使用变量,请将其设置为未定义。
  • @Blindman67。我同意 undefined 在语义上比 null 更正确,但在 JS 中 undefined 代表 both 未声明的 var 和 var test=undefined。因此,当test 未声明和test 未定义时,典型的安全检查 (typeof test==='undefined') 将不幸返回 true。分配 test=null 首先允许进行适当的安全检查 (typeof test==='undefined'),然后允许 if(test===null)。而且......(他轻声说,所以没人听到)...... null 只需要输入 4 个字符,而 undefined 需要输入 9 个字符。 :-O
  • @markE 引用 MDN “但是,应该避免这种技术。” 指的是typeof ? === "undefined",他们是正确的,因为你应该知道变量的范围,所以不需要这个测试并将其作为属性引用。 window["v"] === undefined 广泛使用null 而不是undefined 意味着我必须审查参数arg !== undefined && !== null ? arg : defV,这既丑陋又低效。保存 5 个字符(我知道这就是它流行的原因)意味着我必须为每个可选的参数添加 13 个字符。这让我无休止......:P
猜你喜欢
  • 2015-02-14
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2016-08-26
  • 2022-01-07
相关资源
最近更新 更多