在 JavaScript 中删除对象

IT技术 javascript pointers object memory-management garbage-collection
2021-01-12 17:16:27

我对 JavaScript 的delete运算符有点困惑取下面的一段代码:

var obj = {
    helloText: "Hello World!"
};

var foo = obj;

delete obj;

这段代码被执行后,objnull,但foo仍然引用一个与 完全一样的对象obj我猜这个对象与foo指向的对象相同

这让我很困惑,因为我预计写入会delete obj删除obj指向内存中的对象——而不仅仅是变量obj

这是因为JavaScript的垃圾回收工作在保留/释放的基础,所以,如果我没有指向对象的任何其他变量,它从内存中清除?

(顺便说一下,我的测试是在 Safari 4 中完成的。)

6个回答

delete 操作符只删除一个引用,而不是一个对象本身。如果它确实删除了对象本身,则其他剩余的引用将悬空,就像 C++ 删除一样。(并且访问其中一个会导致崩溃。让它们全部变为 null 意味着在删除或每个对象的额外内存时需要额外的工作。)

由于 Javascript 是垃圾收集的,因此您不需要删除对象本身 - 当无法再引用它们时,它们将被删除。

如果您完成了对对象的引用,删除对它们的引用会很有用,因为这为垃圾收集器提供了有关可以回收的内容的更多信息。如果对一个大对象的引用仍然存在,这可能会导致它无法回收——即使程序的其余部分实际上并未使用该对象。

一个对象的属性可以是另一个对象。例如;var obj = {a: {}}; delete obj.a;
2021-03-28 17:16:27
delete关键字仅适用于对象的属性,而不适用于变量。Perfectionkills.com/understanding-delete
2021-03-29 17:16:27
@Soaku 不是局部变量。(例如那些用 声明的var
2021-03-31 17:16:27
@AlexJM 是的,Guffa 的下一个答案(及其评论)对此进行了详细讨论。
2021-04-02 17:16:27
但是……变量实际上不是 的属性window吗?
2021-04-04 17:16:27

delete命令对常规变量没有影响,仅对属性有影响。delete命令属性没有 value null,它根本不存在。

如果该属性是一个对象引用,该delete命令将删除该属性而不是该对象。如果对象没有其他引用,垃圾收集器将处理该对象。

例子:

var x = new Object();
x.y = 42;

alert(x.y); // shows '42'

delete x; // no effect
alert(x.y); // still shows '42'

delete x.y; // deletes the property
alert(x.y); // shows 'undefined'

(在 Firefox 中测试。)

@Tarynn:我明白了,这就是问题所在。如果您在控制台中执行此操作,由于某种原因x在某些浏览器中将不是一个适当的变量,而是window对象中的一个属性这当然是控制台的问题,并不能反映代码通常是如何执行的。
2021-03-21 17:16:27
如果这是在全局范围内执行,您的x变量将成为全局window对象上的一个属性,并且delete x;确实完全删除了该x变量。
2021-03-22 17:16:27
@chao:我明白了。您遇到了与 Tarynn 相同的问题(请参阅之前的评论)。当您在控制台中执行此操作时,它的工作方式与实际代码中的不同。
2021-03-22 17:16:27
@crescentfresh:如果它被隐式声明,它只是一个属性。如果它像示例中那样显式声明,则它是一个全局变量,不能删除。
2021-04-04 17:16:27
@Guffa 经过大量研究,我不得不承认这可能是一件好事,我没有足够的代表来拒绝投票。我最诚挚的歉意,并感谢您抽出宝贵时间来告诉我发生了什么happeneing ......这里是一个深入explination:perfectionkills.com/understanding-delete/#firebug_confusion
2021-04-04 17:16:27

“隐式声明的变量”是全局对象的属性,因此删除对它们的作用就像对任何属性一样。用 var 声明的变量是不可破坏的。

也一样let
2021-03-22 17:16:27
我从来没有意识到 var 是如此糟糕。
2021-04-05 17:16:27
这是一个很好的观点,也是一个 JS 问题。人们习惯于删除窗口变量,然后想知道为什么他们不能对局部变量做同样的事情。
2021-04-07 17:16:27

来自 Mozilla 文档,“您可以使用 delete 运算符删除隐式声明的变量,但不能删除使用 var 语句声明的变量。”

这是链接:https : //developer.mozilla.org/En/Core_JavaScript_1.5_Reference : Operators : Special_Operators : delete_Operator

delete 不用于删除 Java Script 中的对象。

delete用于删除object key您的情况

var obj = { helloText: "Hello World!" }; 
var foo = obj;
delete obj;

对象未删除检查 obj 仍然采用相同的值 删除用法:

delete obj.helloText

然后检查obj, foo,两者都是空对象。