【问题标题】:How to correctly dereference then delete a JavaScript Object?如何正确取消引用然后删除 JavaScript 对象?
【发布时间】:2014-10-16 22:15:50
【问题描述】:

我想知道从内存中完全取消引用 JavaScript 对象的正确方法。确保它被删除而不会在内存中悬空,并且垃圾收集器会删除该对象。

当我看到这个问题时Deleting Objects in JavaScript。说明如果删除对象的所有引用,GC 会将其从内存中删除。我想知道如何从同时具有方法和属性的对象中删除引用。

假设您有一个使用function 创建的对象,并且该对象同时具有方法和属性。说它看起来像这样:

function myObject(x, y) {
   this.x = x; 
   this.y = y;

   this.myMethod = function() {
      // method code
   }
}

var myInstance = new myObject(24, 42) // How to remove this completely?

注意:这是一个例子,我知道你可以使用prototype作为方法。

我知道我不能只说delete myInstance。所以在这种情况下要完全删除对象,我需要在它的所有属性上调用delete,然后在实例上调用delete,像这样吗?

delete myInstance.x;
delete myInstance.y;
delete myInstance; // I'm not sure if this is necessary.

这行得通吗?还是我还需要delete 它的方法(如果是这样的话)?

或者也许有更好更简单的方法来做到这一点?

【问题讨论】:

    标签: javascript object memory-management garbage-collection dereference


    【解决方案1】:

    Javascript 是一种垃圾收集语言。只有当没有其他代码引用它时,它才会清理对象。这些其他引用要么超出范围(并且不被闭包持有),要么您可以将这些其他变量设置为其他变量,这样它们就不会指向您的对象。当没有其他变量引用您的对象时,垃圾收集器将自动处理它,包括它具有的任何属性(假设这些属性本身都不是某个对象引用的对象 - 但即便如此主机对象将被清理,只有属性中的对象会继续存在)。

    您不能在 Javascript 中以任何其他方式删除对象。

    所以,要删除由此创建的对象:

    var myInstance = new myObject(24, 42) // How to remove this completely?
    

    像这样清除myInstance

    myInstance = null;
    

    您根本不需要手动 delete 来自 myInstance 的属性。如果没有人引用母对象并且没有属性是某人引用的对象,那么垃圾收集器将为您清理所有内容。

    delete 运算符主要用于在您希望母对象保留时(例如,当您只想删除属性时)从对象中删除属性。

    【讨论】:

    • 嗯,有道理。我有一个快速的子问题。如果我的对象在一个数组中,我应该先将其设置为null,然后将其从数组中删除(例如splice())?
    • @SpencerWieczorek - 您无需先将其设置为 null - 这只是无用的代码。如果您尝试删除数组元素中的引用,您可以使用.splice() 删除该数组元素。这将删除对数组中对象的引用,因此您已经完成了所有 GC 需要。如果您希望数组元素保留在数组中,但想清除对对象的引用,那么您可以将该数组元素设置为 null,但不需要使用 .splice(),因为您要离开数组元素就位。
    • 感谢您的回复,我之前一直使用.splice(),并且一直怀疑 GC 是否正在获取所有内容(我在当前项目中删除/添加了大量对象,所以我想确定)。感谢您澄清这一点。
    猜你喜欢
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2015-09-22
    • 2014-08-19
    • 2013-10-13
    • 2012-09-09
    相关资源
    最近更新 更多