2010-06-08 19 views
5

¿Cuál es la mejor manera de desasignar una matriz de matriz en JavaScript para asegurarse de que no se produzcan pérdidas de memoria?La mejor manera de desasignar una matriz de matriz en javascript

var foo = new Array(); 
foo[0] = new Array(); 
foo[0][0] = 'bar0'; 
foo[0][1] = 'bar1'; 
foo[1] = new Array(); 
... 
  1. de eliminación (foo)?
  2. iterar a través de foo, eliminar (foo [index]) y eliminar (foo)?
  3. 1 y 2 me dan el mismo resultado?
  4. ninguno?

Respuesta

1

no se puede eliminar la variable, la pusieron nula foo = null;

.. o utilizar un objeto de espacio de nombres

var namespace = {}; 
namespace.foo = []; 
delete namespace.foo; 
0

Creo Array.splice también puede hacer el truco para usted. Es una alternativa al uso de eliminar en cada índice.

Ref: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/Splice

También se pueden combinar con Array.forEach así:

foo.forEach(function(element,ind,arr){ 
arr.splice(ind,1); //emptying the array 
}); 
foo = null; //remove ref to empty array 

Si sólo utiliza la parte forEach, se le vacíe la matriz foo. Creo que internamente el método de empalme elimina una referencia por lo que será bueno eliminar los elementos de esta manera. La última línea elimina la referencia a la matriz vacía que queda.

No estoy muy seguro de esto, pero vale la pena investigar un poco.

+1

No tiene sentido borrar cada conjunto, a menos que se haga referencia en otro lugar. – SLaks

+1

'foo.length = 0;' puede hacer exactamente lo mismo. – CMS

+0

Haciéndolo de esta manera es O (n^2) :( El empalme desde el frente de la matriz es O (n) ya que cada elemento se reindexa. La solución que sugiere lo hace n veces, dando O (n^2) complejidad –

7
foo = null; 

debería ser suficiente para que el recolector de basura para deshacerse de la matriz, incluyendo todas sus subarrays (suponiendo que nada más tiene una referencia a ellos). Tenga en cuenta que solo se deshará de él cuando lo desee, no de inmediato, así que no se sorprenda si el consumo de memoria del navegador no disminuye inmediatamente: eso no es una fuga.

Posiblemente se vuelve más complicado si alguno de esos elementos de matriz contiene referencias a nodos DOM.

+1

Solo se vuelve más complicado en IE6. – SLaks

+2

Para aquellos que visitan aquí en 2014, tenga en cuenta que casi nunca hay motivo para establecer algo para anular o tratar de "desasignarlo" (un concepto que no existe en JS), o hacer cualquier otra cosa para que el GC haga algo. Está bien por sí mismo, muchas gracias. –

Cuestiones relacionadas