我有点搞不懂JavaScript的删除操作符。以下面这段代码为例:

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

var foo = obj;

delete obj;

执行这段代码后,obj为空,但foo仍然引用与obj完全相同的对象。我猜这个对象就是foo指向的那个对象。

这让我很困惑,因为我以为写delete obj删除的是obj在内存中所指向的对象——而不仅仅是变量obj。

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

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


当前回答

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'

(在Firefox中测试。)

其他回答

刚刚找到一个jsperf,你可能认为有趣的在这个问题上。(把它放在周围可以方便地完成图片)

它比较了delete、设置null和设置undefined。

但请记住,当您多次删除/设置属性时,它会测试情况。

如果你想根据对象的值删除它,可以这样做:

Object.keys(obj).forEach((key) => {
  if (obj[key] === "Hello World!") {
    delete obj[key];
  }
});

但是删除对象并不是一个好主意。设它为undefined,这样当你把它传递给一个参数时。它不会显示出来。无需删除。

Object.keys(obj).forEach((key) => {
  if (obj[key] === "Hello World!") {
    obj[key] = undefined;
  }
});

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

因为Javascript是垃圾收集的,所以你不需要删除对象本身——当没有办法再引用它们时,它们就会被删除。

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

在java脚本中,delete不用于删除对象。

在本例中,用于删除对象键的Delete

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

对象没有被删除检查obj仍然使用相同的值删除用法:

delete obj.helloText

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

这对我很有用,尽管这不是一个好的练习。它简单地删除所有的 对象所属的关联元素。

 for (element in homeService) {
          delete homeService[element];
  }