2010-06-08 7 views
5

Qual è il modo migliore per deallocare una matrice di array in javascript per assicurarsi che non si verifichi alcuna perdita di memoria?Il modo migliore per deallocare una matrice di array in javascript

var foo = new Array(); 
foo[0] = new Array(); 
foo[0][0] = 'bar0'; 
foo[0][1] = 'bar1'; 
foo[1] = new Array(); 
... 
  1. delete (foo)?
  2. itera su foo, elimina (foo [indice]) ed elimina (foo)?
  3. 1 e 2 mi danno lo stesso risultato?
  4. nessuno?

risposta

1

non è possibile eliminare variabile, impostare nullo foo = null;

.. o utilizzare oggetti dello spazio dei nomi

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

Penso Array.splice potrebbe anche fare il trucco per voi. È un'alternativa all'utilizzo dell'eliminazione su ciascun indice.

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

È possibile anche combinare con Array.forEach in questo modo:

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

se si utilizza la parte forEach, si svuotare la matrice foo. Penso che internamente il metodo splice rimuova un riferimento, quindi in questo modo sarete in grado di rimuovere gli elementi. L'ultima riga rimuove quindi il riferimento all'array vuoto rimasto.

Non molto sicuro su questo ma merita qualche ricerca.

+1

Non è necessario cancellare tutti gli array, a meno che non vengano referenziati altrove. – SLaks

+1

'foo.length = 0;' può fare esattamente lo stesso. – CMS

+0

In questo modo è O (n^2) :( La giuntura dalla parte anteriore dell'array è O (n) poiché ogni elemento viene reindicizzato.La soluzione suggerita lo fa n volte, dando O (n^2) complessità –

7
foo = null; 

dovrebbe essere sufficiente per il garbage collector per sbarazzarsi della matrice, con tutti i suoi array figlio (supponendo che non altro ha un riferimento a loro). Si noti che lo eliminerà solo quando lo desidera, non immediatamente, quindi non stupitevi se il consumo di memoria del browser non diminuisce immediatamente: non è una perdita.

È potenzialmente più complicato se uno qualsiasi di questi elementi di matrice contiene riferimenti a nodi DOM.

+1

Diventa sempre più complicato in IE6 – SLaks

+2

Per coloro che visitano qui nel 2014, si noti che non c'è quasi mai motivo di impostare qualcosa su null o provare a "deallocarlo" (un concetto che non esiste in JS), o fare qualsiasi altra cosa per fare in modo che il GC faccia qualcosa, ma va benissimo da solo, grazie mille. –

Problemi correlati