javascript - 何时/是否在 Javascript 中使用 Delete

标签 javascript memory-management garbage-collection

我刚刚发现 javascript 有一个 delete 语句。我已经阅读了一些有关它的内容,但并没有变得更聪明。

所以我希望得到一个关于何时应该使用它的功能定义,如果有的话。所以我知道我可以删除对象的属性;正如这个 fiddle 所表明的那样:

var myData = {a:"hello",b:"world"};
alert(myData.b);
delete myData.b;
alert(myData.b);

在连续的警报中显示“world”然后未定义。但是,您不能像这样使用 delete(就像在 C++ 中那样):

function data() {
    this.attribute1 = "aww";
    this.attribute2 = "poo";
}

var myData = new data();
delete myData;

这里delete返回false表示不能删除myData。我以前主要在 C++ 中工作,这就像删除的整个想法。我想不出我会使用 delete 删除属性的任何理由。我是否应该担心使用 delete 来标记要释放的内存?就像我做这样的事情一样。

var myData = new data();
... //do stuff
myData = new data();

添加

所以我把那个让我困惑的帖子挖了出来。关于此 question 的最赞回答状态(引用自 Apple Javascript 编码指南):

Use delete statements. Whenever you create an object using a new statement, pair it with a delete statement. This ensures that all of the memory associated with the object, including its property name, is available for garbage collection. The delete statement is discussed more in “Freeing Objects.”

所以,如果我理解我得到的一些评论和答案,这个说法是不准确的,因为你甚至不能对使用 new 语句创建的对象调用 delete。

最佳答案

根据 mozilla 的开发者文档,delete 不能那样工作。

delete 运算符从对象中删除属性,它不会删除对象本身。

因此,与其像您演示的那样使用它,不如像下面这样使用它:

myGlobalObject = {};
var myObject = {};
myObject.propertyA = "blah";

// Do some stuff

delete myObject.propertyA; // This works because you're deleting a property off myObject
delete myGlobalObject; // This works because myGlobalObject is a property of the global object.
delete myObject; // This does NOT work - most likely because you declared it using the var keyword

虽然这实际上并没有进行垃圾收集。此外,如果 myObject 在具有 propertyA 的链上有一个原型(prototype),它仍然会通过原型(prototype)继承该属性。

如需更深入的信息,请随时查看开发人员文档:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

关于javascript - 何时/是否在 Javascript 中使用 Delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33659542/

相关文章:

javascript - 谷歌地图 - 在标记点击中心 map

javascript - 如何将javascript变量传递给脚本标签中的数据电子邮件

c++ - "placement new"有什么用?

c - 如何坚持 C 编译器将局部变量放在堆栈上,而不是寄存器中

go - 为什么 Go 可以将 GC 暂停时间降低到 1 毫秒以下,而 JVM 却没有?

javascript - 如何从 <canvas> 中的一张图像中捕获多张图像?

php - 在 javascript 中导入 php 变量

c - 函数外释放内存

c++ - 如何判断一个对象是在构造函数上静态分配还是动态分配?

web-services - 在长期运行的Common Lisp应用程序中,应使用什么策略来管理垃圾?