pointers javascript記憶體回收 - 在JavaScript中刪除對象




garbage collection (11)

將變量設置為null可以確保中斷所有瀏覽器中對象的引用,包括DOM元素和Javascript範圍之間的循環引用。 通過使用delete命令,我們標記了要在垃圾集合的下一次運行中清除的對象,但是如果有多個變量引用同一個對象,則刪除單個變量不會釋放該對象,它將僅刪除該變量之間的鏈接和對象。 在垃圾收集的下一次運行中,只有變量將被清理。

我對JavaScript的delete操作符有點困惑。 採取以下一段代碼:

var obj = {
    helloText: "Hello World!"
};

var foo = obj;

delete obj;

這段代碼執行完畢後, objnull ,但foo仍然引用與obj完全相同的obj 。 我猜這個對foo指向的同一個對象。

這讓我感到困惑,因為我期望寫入delete obj刪除了obj在內存中指向的對象 - 而不僅僅是變量obj

這是因為JavaScript的垃圾收集器正在保留/釋放的基礎上工作,所以如果我沒有任何其他變量指向對象,它從內存中刪除?

(順便說一下,我的測試是在Safari 4中完成的。)


這項工作對我來說,雖然不是一個好的做法。 它只是刪除該對象所屬的所有關聯元素。

 for (element in homeService) {
          delete homeService[element];

剛剛發現一個jsperf你可能會認為這件事情很有趣。 (可以很方便地保留它來完成圖片)

它比較刪除 ,設置null和設置未定義

但請記住,當您多次刪除/設置屬性時,它會測試案例。


基於@Guffa的回答。 我發現以下方法適用於我:

var obj = {
    helloText: "Hello World!"
};

obj = null;

delete obj;

通過首先將obj設置為null ,可以刪除對它的所有引用,然後可以完全刪除它。

我沒有在其他瀏覽器上測試它,但是它在phonegap 1.7.0中工作


“隱式聲明的變量”是全局對象的屬性,因此刪除對它們起作用,就像它對任何屬性起作用一樣。 用var聲明的變量是堅不可摧的。


delete命令對常規變量,只有屬性沒有影響。 delete命令後,該屬性不具有值null ,它根本不存在。

如果該屬性是對象引用,則delete命令將刪除該屬性,但不會刪除該對象。 如果垃圾收集器沒有其他引用,垃圾收集器將負責處理該對象。

例:

var x = new Object();
x.y = 42;

alert(x.y); // shows '42'

delete x; // no effect
alert(x.y); // still shows '42'

delete x.y; // deletes the property
alert(x.y); // shows 'undefined'

(在Firefox中測試)


delete不用於刪除java腳本中的對象。

delete用於刪除您的案例中的object key

var obj = { helloText: "Hello World!" }; 
var foo = obj;
delete obj;

對像不被刪除檢查obj仍然採用相同的值刪除用法:

delete obj.helloText

然後檢查obj, foo ,都是空對象。


刪除操作符只會刪除一個引用,而不會刪除一個對象本身。 如果它確實刪除了對象本身,那麼其他剩餘的引用就會像C ++刪除那樣懸而未決。 (並且訪問其中的一個會導致崩潰,為了使它們全部變為空將意味著在刪除每個對像或為每個對象添加額外內存時需要額外的工作。)

由於Javascript是垃圾收集的,你不需要自己刪除對象 - 當無法再引用它們時,它們將被刪除。

如果完成對象的引用,那麼刪除對象的引用會很有用,因為這會為垃圾回收器提供有關可回收內容的更多信息。 如果引用保留給一個大對象,這可能會導致它不被回放 - 即使程序的其餘部分實際上並未使用該對象。




use strict 是一種讓你的代碼更安全的方法,因為你不能使用危險的功能,這些功能可能不會像你期望的那樣工作。並且在它使代碼更加嚴格之前被編寫。







javascript pointers object memory-management garbage-collection