假设我在 JavaScript 中创建了一个对象及其属性,如下所示 -
var obj = {};
obj['bar'] = 123;
obj['bar']['foo'] = new Array();
obj['bar']['xyz'] = new Array();
在此之后,我将元素推送到两个数组中。如果我再写
delete obj['bar'];
这两个数组也会被删除吗?
假设我在 JavaScript 中创建了一个对象及其属性,如下所示 -
var obj = {};
obj['bar'] = 123;
obj['bar']['foo'] = new Array();
obj['bar']['xyz'] = new Array();
在此之后,我将元素推送到两个数组中。如果我再写
delete obj['bar'];
这两个数组也会被删除吗?
这两个数组也会被删除吗?
假设没有其他任何东西对它们有任何引用,它们将有资格进行垃圾收集。根据该代码,什么都不会。何时以及是否真正清理它们取决于实施。
但请注意,即使在您 remove 之前,它们也有资格获得 GC bar
,因为您的代码正在做一些非常奇怪的事情。见评论:
// 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
...然后foo
andxyz
属性不会立即消失,并且数组会一直存在直到bar
被清理干净。
delete
本身不会清除数组,但会删除对它们的唯一现有引用。除非您在其他地方捕获对它们的引用,否则它们将被 GC 声明,因为在那之后它们将没有引用。
GC 何时、如何或是否实际回收它们的内存取决于实现。
是的,您可以删除obj['bar']
使关联数组obj['bar']
符合垃圾收集条件的属性(假设在其他地方没有其他对它们的引用)。
你不能delete obj
。但是,您可以使用obj = null;
释放 obj 的属性以进行潜在的垃圾收集。
如果函数成功删除了某些内容,则该delete
函数返回,如您在此jsfiddle中所见true
alert(delete obj['bar']); // alerts true;
但是,您不能删除变量或函数。
var x = 2;
alert(delete x); // alerts false;
function x(){};
alert(delete x); // alerts false;
如需进一步阅读,这里有一篇关于 javascriptdelete
功能的精彩文章:http: //perfectkills.com/understanding-delete/