[英]JavaScript weird behavior when object deleted
我已經完成以下工作:
a = {a:1};
b = {b:1};
c = [a,b]
delete a;
現在我不明白為什么c仍然有兩個對象:[a,b],但是當我嘗試打印a時 ,控制台給我: Uncaught ReferenceError:a not defined
似乎對象不再存在,但它仍然存在於數組中。
我也嘗試打印:
typeof a //"undefined"
typeof c[0] //"object"
我確定在將對象分配給變量時,它是通過引用分配的。 似乎這里的對象已被復制?
與通常的想法不同,刪除操作符與直接釋放內存無關。 內存管理是通過中斷引用間接完成的,有關更多詳細信息,請參見內存管理頁面。
在這里閱讀
即使在你刪除a
的參考a
將存儲在c
。
因此, c
將始終是object
類型。
a = {a:1}; b = {b:1}; c = [a,b]; delete a; console.log(c);
上面的代碼將返回:
[
{
"a": 1
},
{
"b": 1
}
]
但是,如果你刪除delete c[0].a
然后它會刪除a
從陣列c
:
a = {a:1}; b = {b:1}; c = [a,b]; console.log (delete c[0].a); console.log(c);
輸出將是:
[
{},
{
"b": 1
}
]
delete
運算符從對象中刪除屬性。
也就是說,如果您有一個對象const obj = { a: 56, b: 62 }
並執行delete obj.b
,則b
屬性將被刪除,而object僅為{ a: 56 }
。
由於您沒有聲明任何變量,因此您將隱式地處理window對象。 您的代碼等效於:
window.a = {a:1};
window.b = {b:1};
window.c = [window.a, window.b]
delete window.a;
如您所見,您只是向window
對象添加了一些屬性,然后刪除了其中之一。 但是,您沒有刪除分配給該屬性的對象。
JavaScript中的任何對象都將保留,直到不再引用每個對象為止。 在這里,仍然清楚地引用了您希望在分配給window.c
的數組中刪除的對象,並且該對象未銷毀。 (再想一想:如果對象被刪除,您期望在數組中是什么?)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.