Javascript 删除对象/关联数组

Javascript 删除对象/关联数组,javascript,object,Javascript,Object,假设我在JavaScript中创建了一个对象及其属性,如下所示- var obj = {}; obj['bar'] = 123; obj['bar']['foo'] = new Array(); obj['bar']['xyz'] = new Array(); 之后,我将元素推入两个数组中。 如果我写 delete obj['bar']; 这两个数组也会被删除吗?delete本身不会清除数组,但会删除对它们的唯一现有引用。除非您在其他地方捕获对它们的引用,否则它

假设我在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();
因此,您甚至不必删除
,这些数组立即就可以进行垃圾收集。之所以会出现这种情况,是因为在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'] = {};


…然后
foo
xyz
属性不会立即消失,数组将一直保留,直到清理
bar
为止。

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

您不能
删除obj
。但是可以使用
obj=null;
释放obj的属性以进行潜在的垃圾收集

delete
函数返回
true
,如果它成功地删除了某些内容,如您在本示例中所看到的

但是,您不能删除变量或函数

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

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

为了进一步阅读,这里有一篇关于javascript的
delete
函数的精彩文章:

从删除操作成功的意义上删除,或者从GC'd的意义上删除?好的。因此,这与我发布delete['obj'][arrayname]一样单独使用?不。在那之后你仍然会有一个空对象。但是数组会消失(再次,除非在其他地方引用)。实际上我希望它们被GC’d并释放它们的空间。这会实现的,对吗?它们将成为合格的。更新的答案。啊。谢谢你的解释!!这样一堵文本墙可以覆盖“仅删除对象属性”?
alert(delete obj['bar']); // alerts true;
var x = 2;
alert(delete x); // alerts false;

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