在 JavaScript 中删除对象

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

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

var foo = obj;

delete obj;

执行这段代码后,是 ,但仍然引用与 的对象完全相同。我猜这个对象是指向的同一个对象。objnullfooobjfoo

这让我感到困惑,因为我期望写入删除了指向内存中的对象 - 而不仅仅是变量 。delete objobjobj

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

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


答案 1

delete 运算符仅删除引用,从不删除对象本身。如果它确实删除了对象本身,则其他剩余的引用将悬空,例如C++删除。(访问其中一个会导致崩溃。要使它们全部变为 null,则意味着在删除每个对象时需要额外的工作或额外的内存。

由于Javascript是垃圾回收的,你不需要删除对象本身 - 当没有办法再引用它们时,它们将被删除。

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


答案 2

该命令对常规变量没有影响,只对属性有影响。在命令之后,属性没有值,它根本不存在。deletedeletenull

如果属性是对象引用,则该命令将删除该属性,但不会删除该对象。如果对象没有其他引用,垃圾回收器将处理该对象。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'

(在火狐中测试。