如何正确解除引用然后删除JavaScript对象?

Spe*_*rek 9 javascript garbage-collection memory-management object dereference

我想知道从内存中完全取消引用JavaScript对象的正确方法.确保删除它没有在内存中悬空,并且垃圾收集器删除了对象.

当我看到这个问题时,在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?
Run Code Online (Sandbox Code Playgroud)

注意:这是一个例子,我知道你可以prototype用于方法.

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

delete myInstance.x;
delete myInstance.y;
delete myInstance; // I'm not sure if this is necessary.
Run Code Online (Sandbox Code Playgroud)

这会有用吗?或者我还需要delete它的方法(如果是这样的话)?

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

jfr*_*d00 10

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

您无法在Javascript中以任何其他方式删除对象.

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

var myInstance = new myObject(24, 42) // How to remove this completely?
Run Code Online (Sandbox Code Playgroud)

就像这样清楚myInstance:

myInstance = null;
Run Code Online (Sandbox Code Playgroud)

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

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

  • @SpencerWieczorek - 您无需先将其设置为 `null` - 那只是无用的代码。如果你想删除一个数组元素中的引用,你可以使用`.splice()` 来删除该数组元素。这将删除对数组中对象的引用,因此您已经完成了所有 GC 需求。如果您希望数组元素保留在您的数组中,但想要清除对对象的引用,那么您可以将该数组元素设置为 `null`,但不需要使用 `.splice()`,因为您'将数组元素留在原处。 (2认同)