簡體   English   中英

對象刪除時的JavaScript怪異行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM