簡體   English   中英

刪除對象/關聯數組

[英]Delete object/associative array

可以說我已經在JavaScript中創建了一個對象及其屬性,如下所示:

   var obj = {};
   obj['bar'] = 123;
   obj['bar']['foo'] = new Array();
   obj['bar']['xyz'] = new Array();

之后,我將元素推入兩個數組。 如果我再寫

   delete obj['bar'];

兩個數組也會被刪除嗎?

delete本身不會清除數組,但會刪除對它們的唯一現有引用。 除非您在其他地方獲得對它們的引用,否則,它們將被GC聲明為版權聲明,因為在此之后將不再有引用。

GC何時,如何或實際上是否回收其內存取決於實現。

兩個數組也會被刪除嗎?

他們將有資格進行垃圾回收 ,前提是沒有其他任何引用。 根據該代碼,將不會有任何結果。 何時以及是否真正清除它們取決於實現。

但是請注意,即使在刪除bar之前,它們也有資格使用GC,因為您的代碼做得很奇怪。 查看評論:

// Creates a blank object, so far so good.
var obj = {};

// Sets the `bar` property to the number 123.
obj['bar'] = 123;

// Retrieves the value of `bar` (the primitive number 123) and
// *converts* it into a `Number` instance (object), then
// creates a property on that object called `foo`, assigning a
// blank array to it. Because the Number object is never stored
// anywhere, both it and the array are IMMEDIATELY eligible for
// garbage collection. The value of `obj['foo']` is unaffected,
// it remains a primitive number.
obj['bar']['foo'] = new Array();

// The same happens again, a temporary Number instance and
// array are created, but both are IMMEDIATELY eligible for
// garbage collection; the value of `obj['bar']` is unaffected.
obj['bar']['xyz'] = new Array();

因此,您甚至不必刪除bar ,這些數組立即可以進行垃圾回收。 發生這種情況的原因是,在JavaScript中,數字是可以自動提升為Number對象的基元,但是不會影響分配給基元編號的屬性的值。 所以:

var obj = {};
obj['bar'] = 123;
obj['bar']['foo'] = [];         // [] is a better way to write new Array()
console.log(obj['bar']['foo']); // "undefined"

如果將obj['bar'] =行更改為:

obj['bar'] = {};

要么

obj['bar'] = []; // Arrays are objects

...然后fooxyz屬性不會立即消失,並且數組將一直存在,直到bar被清除為止。

是的,你可以刪除obj['bar']屬性,這將使相關聯的陣列中obj['bar']進行垃圾回收(假設有其他地方對他們沒有其他的引用)。

您不能delete obj 但是,您可以使用obj = null; 釋放obj的屬性以進行潛在的垃圾回收。

如果成功刪除了某些內容,則delete函數返回true ,如您在此jsfiddle中所見

alert(delete obj['bar']); // alerts true;

但是,您不能刪除var或函數。

var x = 2;
alert(delete x); // alerts false;

function x(){};
alert(delete x); // alerts false;

若要進一步閱讀,這里有一篇有關javascript delete功能的精彩文章: http : //perfectionkills.com/understanding-delete/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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