javascript - leak - js new memory




在JavaScript中刪除對象 (8)

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

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

var foo = obj;

delete obj;

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

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

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

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


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


IE 5到8有一個bug,在主機對象(Window,Global,DOM等)的屬性上使用delete會引發TypeError“對像不支持這個動作”。

var el=document.getElementById("anElementId");
el.foo = {bar:"baz"};
try{
    delete el.foo;
}catch(){
    //alert("Curses, drats and double double damn!");
    el.foo=undefined; // a work around
}

後來,如果你需要檢查屬性的含義是否為完整值,請使用el.foo !== undefined因為"foo" in el將始終在IE中返回true。

如果你真的需要財產真的消失......

function hostProxy(host){
    if(host===null || host===undefined) return host;
    if(!"_hostProxy" in host){
       host._hostproxy={_host:host,prototype:host};
    }
    return host._hostproxy;
}
var el=hostProxy(document.getElementById("anElementId"));
el.foo = {bar:"baz"};

delete el.foo; // removing property if a non-host object

如果您需要使用主機API的主機對象...

el.parent.removeChild(el._host);

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中測試)



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

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

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


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

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

obj = null;

delete obj;

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

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


我在搜索這個相同的答案時偶然發現了這篇文章。 我最終做的只是彈出obj.pop()所有存儲在對像中的值/對象,以便我可以重用該對象。 不知道這是否是不好的做法。 這項技術對於我在Chrome開發工具或FireFox Web控制台中測試我的代碼非常方便。


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

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




garbage-collection