在JavaScript中删除对象
我对JavaScript的delete
操作符有点困惑。 采取以下一段代码:
var obj = { helloText: "Hello World!" }; var foo = obj; delete obj;
这段代码执行完毕后, obj
是null
,但是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];