我有点搞不懂JavaScript的删除操作符。以下面这段代码为例:
var obj = {
helloText: "Hello World!"
};
var foo = obj;
delete obj;
执行这段代码后,obj为空,但foo仍然引用与obj完全相同的对象。我猜这个对象就是foo指向的那个对象。
这让我很困惑,因为我以为写delete obj删除的是obj在内存中所指向的对象——而不仅仅是变量obj。
这是因为JavaScript的垃圾收集器是在保留/释放的基础上工作的,所以如果我没有任何其他变量指向对象,它将从内存中删除?
(顺便说一下,我的测试是在Safari 4中完成的。)
ie5到ie8有一个错误,在主机对象(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”在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);