2016-05-14 75 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

相關問題