2016-05-14 40 views
2

让我们在开始时说,我们将:当在Javascript中重新分配对象变量时,原始对象会发生什么变化?

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

然后使用变量,如果我想通过调用将其复位后:

chappie = new AI; 

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

+3

除非另有保留,否则它将被GC删除。这是删除不需要的内存分配的可接受的方式。调用解引用。 – Blindman67

+1

取决于你的意思是“重置”。您将创建一个新对象并将其分配给该变量。但是,如果您只想丢弃前一个对象,请将该变量设置为null并且不要创建一个新对象。有点不清楚你的意图是什么。 –

+1

*“有没有更好的方法”* ......如果你想要做的只是覆盖原来的 – charlietfl

回答

0

如果没有更多的对象引用,那么对象最终将被垃圾回收。

如果你原本有1个引用,现在你没有,最终内存将被释放。

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

还有一个参考,所以没有什么变化。

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

如果你想GC启动,那么你可以将var设置为null或者undefined或者其他什么(假设它是上次引用该对象的时间)。

......否则,当var不再需要var时,GC也会清理var本身。 如果被删除的变量是最后一个值的引用,那么该值将被清除。

+1

,那么它们不会被移除,直到它们超出范围。由于undefined具有比null更有意义的上下文含义,所以最好使用undefined而不是null。 'null'被序列化为JSON,'undefined'被忽略。 – Blindman67

+0

@ Blindman67:'null'具有“无对象”的含义,这正是这里所优选的。 – Bergi

+0

@Bergi null是一个占位符。这意味着此时变量没有适用的价值,但是我们希望保留(保留)这个变量以防未来需要。未定义的含义是文字,指的是不存在未定义的实体。它被分配来表明变量不再需要,并且它不再具有有意义的上下文。在序列化/传输/克隆期间,必须保留具有null值的变量,而不像具有未定义变量的变量,该变量可以被转储。如果你没有进一步的使用变量将其设置为未定义。 – Blindman67

相关问题