Ste*_*son 354 javascript garbage-collection pointers memory-management object
我对JavaScript的delete
运算符有点困惑.采取以下代码:
var obj = {
helloText: "Hello World!"
};
var foo = obj;
delete obj;
Run Code Online (Sandbox Code Playgroud)
在执行了这段代码之后,obj
是null
,但foo
仍然指的是一个完全相同的对象obj
.我猜这个对象是foo
指向的同一个对象.
这让我很困惑,因为我期望写作delete obj
删除了obj
指向内存的对象- 而不仅仅是变量obj
.
这是因为JavaScript的垃圾回收工作在保留/释放的基础,所以,如果我没有指向对象的任何其他变量,它会从内存中清除?
(顺便说一句,我的测试是在Safari 4中完成的.)
Jes*_*sak 445
删除操作符仅删除引用,而不删除对象本身.如果它确实删除了对象本身,那么其他剩余的引用将是悬空的,就像C++删除一样.(并且访问其中一个会导致崩溃.要使它们全部变为null将意味着在删除或为每个对象额外的内存时有额外的工作.)
由于Javascript是垃圾收集的,因此您不需要自己删除对象 - 当无法再引用它们时,它们将被删除.
如果您已完成对象的删除,则删除对象的引用会很有用,因为这会为垃圾回收器提供有关可以回收的内容的更多信息.如果对大对象的引用仍然存在,这可能导致它无法回收 - 即使程序的其余部分实际上没有使用该对象.
Guf*_*ffa 158
该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'
Run Code Online (Sandbox Code Playgroud)
(在Firefox中测试过.)
小智 54
"隐式声明的变量"是全局对象的属性,因此delete对它们起作用就像它适用于任何属性一样.用var声明的变量是坚不可摧的.
Dav*_*man 23
来自Mozilla文档,"您可以使用delete运算符删除隐式声明的变量,但不能删除使用var语句声明的变量."
这是链接:https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference : Operators : Special_Operators : delete_Operator
delete
不用于删除 Java Script 中的对象。
delete
用于删除object key
您的情况
var obj = { helloText: "Hello World!" };
var foo = obj;
delete obj;
Run Code Online (Sandbox Code Playgroud)
对象未删除检查 obj 仍然采用相同的值 删除用法:
delete obj.helloText
Run Code Online (Sandbox Code Playgroud)
然后检查obj, foo
,两者都是空对象。