在JavaScript中删除对象

我对JavaScript的delete操作符有点困惑。 采取以下一段代码:

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

这段代码执行完毕后, objnull ,但是foo仍然指向一个完全像obj 。 我猜这个对象是foo指向的同一个对象。

这使我困惑,因为我期望写入delete obj删除了obj在内存中指向的对象 – 不仅仅是variablesobj

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

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

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

由于Javascript是垃圾收集,你不需要自己删除对象 – 当无法再引用它们时,它们将被删除。

如果完成对象的引用,那么删除对象的引用会非常有用,因为这会为垃圾回收器提供有关可回收内容的更多信息。 如果引用保留在一个大的对象上,这可能导致它不被回收 – 即使程序的其余部分实际上并没有使用该对象。

delete命令对常规variables,只有属性没有影响。 delete命令后,属性不具有值null ,它根本不存在。

如果该属性是对象引用,那么delete命令将删除该属性,但不会删除该对象。 如果垃圾收集器没有其他引用,垃圾收集器将会照顾该对象。

例:

 var x = new Object(); xy = 42; alert(xy); // shows '42' delete x; // no effect alert(xy); // still shows '42' delete xy; // deletes the property alert(xy); // shows 'undefined' 

(在Firefox中testing)

“隐含声明的variables”是全局对象的属性,所以删除就像对任何属性起作用一样。 用var声明的variables是坚不可摧的。

来自Mozilla文档,“你可以使用删除操作符来删除隐式声明的variables,但不能删除var语句声明的variables。

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

基于@Guffa的回答。 我发现以下方法适用于我:

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

通过首先将obj设置为null ,可以删除对它的所有引用,然后可以完全删除它。

我没有在其他浏览器上testing它,但是这个工作在手机1.7.0

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

delete用于删除您的情况下的object key

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

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

delete obj.helloText

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

刚发现一个jsperf,你可能会认为这件事情很有趣。 (可以方便地保留它来完成图片)

它比较删除 ,设置null和设置未定义

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

除了GC问题之外,对于性能,应该考虑浏览器可能在后台进行的优化 – >

http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/

看起来可能会更好地将参考归零,而不是将其删除,因为这可能会改变Chrome使用的幕后“类”。

IE 5到8有一个bug,在主机对象(Window,Global,DOM等)的属性上使用delete会引发TypeError“对象不支持这个动作”。

 var el=document.getElementById("anElementId"); el.foo = {bar:"baz"}; try{ delete el.foo; }catch(){ //alert("Curses, drats and double double damn!"); el.foo=undefined; // a work around } 

后来如果你需要检查属性的含义是什么,请使用el.foo !== undefined因为"foo" in el在IE中总是返回true。

如果你真的需要财产真的消失…

 function hostProxy(host){ if(host===null || host===undefined) return host; if(!"_hostProxy" in host){ host._hostproxy={_host:host,prototype:host}; } return host._hostproxy; } var el=hostProxy(document.getElementById("anElementId")); el.foo = {bar:"baz"}; delete el.foo; // removing property if a non-host object 

如果您需要使用主机API的主机对象…

 el.parent.removeChild(el._host); 

我在search这个相同的答案时偶然发现了这篇文章。 我最终做的只是popupobj.pop()所有存储的值/对象在我的对象,所以我可以重用该对象。 不知道这是否是不好的做法。 这个技术对于我在Chrome开发工具或FireFox Web控制台中testing我的代码非常方便。

将variables设置为null可确保在所有浏览器中中断对所有对象的引用,包括在DOM元素和JavaScript范围之间进行的循环引用。 通过使用delete命令,我们标记了在下次运行Garbage集合时被清除的对象,但是如果有多个variables引用同一个对象,那么删除一个variables就不会释放这个对象,只会删除这个variables之间的联系和对象。 在垃圾收集的下一次运行中,只有variables将被清除。

这项工作对我来说,虽然不是一个好的做法。 它只是删除该对象所属的所有关联元素。

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