在JavaScript中删除对象

Ste*_*son 354 javascript garbage-collection pointers memory-management object

我对JavaScript的delete运算符有点困惑.采取以下代码:

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

var foo = obj;

delete obj;
Run Code Online (Sandbox Code Playgroud)

在执行了这段代码之后,objnull,但foo仍然指的是一个完全相同的对象obj.我猜这个对象是foo指向的同一个对象.

这让我很困惑,因为我期望写作delete obj删除了obj指向内存的对象- 而不仅仅是变量obj.

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

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

Jes*_*sak 445

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

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

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

  • `delete`关键字仅适用于对象的属性,而不适用于变量.http://perfectionkills.com/understanding-delete/ (20认同)
  • @Soaku不是局部变量。(例如,用`var`声明的那些) (3认同)
  • @AlexJM 是的,Guffa 的下一个答案(及其评论)对此进行了详细讨论。 (2认同)
  • 但是......变量实际上不是`window`的属性吗? (2认同)

Guf*_*ffa 158

delete命令对常规变量没有影响,只对属性有影响.在delete命令之后,属性没有值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'
Run Code Online (Sandbox Code Playgroud)

(在Firefox中测试过.)

  • 如果这是在全局范围内执行的,那么你的`x`变量只是全局`window`对象的一个​​属性,而`delete x;`确实完全删除了`x`变量. (38认同)
  • @crescentfresh:如果它是隐式声明的,它只是一个属性.如果它在示例中显式声明,则它是一个全局变量,不能删除. (18认同)
  • @Tarynn:我明白了,这就是问题所在.如果你在控制台中执行此操作,由于某种原因,`x`在某些浏览器中不是适当的变量,而是`window`对象中的属性.这当然是控制台的问题,并不反映代码的正常执行方式. (4认同)
  • @Guffa经过一系列的研究,我不得不承认,这可能是一件好事,我没有足够的代表来投票.我最诚挚的道歉,并感谢您花时间向我展示发生了什么...这是一个深入的探索:http://perfectionkills.com/understanding-delete/#firebug_confusion (2认同)
  • @chao:我明白了.您遇到与Tarynn相同的问题(参见前面的评论).在控制台中执行此操作时,它与实际代码中的工作方式不同. (2认同)

小智 54

"隐式声明的变量"是全局对象的属性,因此delete对它们起作用就像它适用于任何属性一样.用var声明的变量是坚不可摧的.

  • 我从未意识到var太糟糕了. (50认同)
  • `let` 也是如此。 (2认同)

Dav*_*man 23

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

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


Uma*_*med 5

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

delete用于删除object key您的情况

var obj = { helloText: "Hello World!" }; 
var foo = obj;
delete obj;
Run Code Online (Sandbox Code Playgroud)

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

delete obj.helloText
Run Code Online (Sandbox Code Playgroud)

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