在JavaScript中删除对象

2020/09/30 13:01 · javascript ·  · 0评论

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

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

var foo = obj;

delete obj;

执行完这段代码后,objis null,但foo仍指的是一个完全像的对象obj我猜这个对象是foo指向相同的对象

这使我感到困惑,因为我希望编写会delete obj删除obj指向内存中的对象,而不仅仅是变量obj

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

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

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

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

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

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'

(在Firefox中测试。)

“隐式声明的变量”是全局对象的属性,因此delete对它们起作用,就像对任何属性起作用一样。用var声明的变量是不可破坏的。

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

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

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

delete用于删除object key您的案例

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

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

delete obj.helloText

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

刚发现一个jsperf,鉴于此,您可能会觉得有趣。(将其保留以完成图片可能很方便)

它比较delete,设置null和设置undefined的情况

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

除了GC问题外,出于性能考虑,还应考虑浏览器可能在后台进行的优化->

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

看来,将引用为空可能比删除引用更好,因为这可能会更改Chrome的幕后“类”用法。

IE 5到8有一个错误,其中在主机对象的属性(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);

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

设置变量以null确保在所有浏览器中都断开对对象的任何引用,包括在DOM元素和Javascript范围之间进行的循环引用。通过使用delete命令,我们标记了要在下次垃圾回收中清除的对象,但是如果有多个变量引用同一对象,则删除单个变量将不会释放该对象,它将删除该变量与物体。并且在下一次运行Garbage集合时,将仅清除变量。

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

 for (element in homeService) {
          delete homeService[element];
  }
本文地址:http://javascript.askforanswer.com/zaijavascriptzhongshanchuduixiang.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!