删除对象/关联数组

时间:2012-07-04 16:34:25

标签: javascript object

假设我在JavaScript中创建了一个对象及其属性,如下所示 -

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

在此之后,我将元素推入两个数组。 如果我再写

   delete obj['bar'];

这两个阵列也会被删除吗?

3 个答案:

答案 0 :(得分:2)

delete本身不会清除数组,但会删除对它们的唯一现有引用。除非您在其他地方捕获对它们的引用,否则它们将被GC声明,因为它们之后将没有引用。

GC实际回收它们的内存的时间,方式或方式取决于实现。

答案 1 :(得分:2)

  

这两个阵列也会被删除吗?

他们将有资格进行垃圾收集,假设没有其他任何引用它们。根据该代码,什么都不会。何时以及是否实际清理完毕取决于实施。

但请注意,即使在删除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被清除。

答案 2 :(得分:1)

是的,您可以删除obj['bar']属性,该属性将使obj['bar']中的关联数组符合垃圾回收条件(假设其他地方没有其他引用)。

你不能delete obj。但是,您可以使用obj = null;释放obj的属性以进行潜在的垃圾回收。

delete函数返回true如果已成功删除了某些内容,请参阅此jsfiddle

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

但是,您无法删除变量或函数。

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

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

有关javascript delete函数的精彩文章,请进一步阅读:http://perfectionkills.com/understanding-delete/