2010-06-08 2 views
5

Каков наилучший способ освободить массив массива в javascript, чтобы избежать утечки памяти?Лучший способ освободить массив массивов в javascript

var foo = new Array(); 
foo[0] = new Array(); 
foo[0][0] = 'bar0'; 
foo[0][1] = 'bar1'; 
foo[1] = new Array(); 
... 
  1. удаления (Foo)?
  2. итерации через foo, delete (foo [index]) и delete (foo)?
  3. 1 и 2 дают мне тот же результат?
  4. нет?

ответ

1

Вы не можете удалять переменную, установите его недействительным foo = null;

.. или использовать объект пространства имен

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

Я думаю Array.splice также может сделать трюк для вас. Это альтернатива использованию delete для каждого индекса.

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

Вы также можете комбинировать его с Array.forEach так:

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

Если вы просто использовать часть Foreach, вы опорожнить массив Foo. Я думаю, что внутренне метод сплайсинга удаляет ссылку, поэтому вы будете хорошо удалять элементы таким образом. Последняя строка затем удаляет ссылку на пустой массив, который оставлен.

Не очень уверен в этом, но стоит исследования.

+1

Нет смысла очищать каждый массив, если они не упоминаются в другом месте. – SLaks

+1

'foo.length = 0;' может делать то же самое. – CMS

+0

Выполнение этого способа - O (n^2) :( Скрещивание с передней стороны массива - это O (n), поскольку каждый элемент получает переиндексирование. Решение, которое вы предлагаете, делает это n раз, что дает сложность O (n^2) –

7
foo = null; 

должно быть достаточно для сборщика мусора, чтобы избавиться от массива, включая все его дочерние массивы (не предполагая ничего, есть ссылка на них). Обратите внимание, что он только избавится от него, когда захочет, а не сразу, поэтому не удивляйтесь, если потребление памяти браузера не сразу пропадает: это не утечка.

Это потенциально усложняется, если какой-либо из этих элементов массива содержит ссылки на узлы DOM.

+1

Это только усложняется в IE6. – SLaks

+2

Для тех, кто посещает здесь в 2014 году, обратите внимание, что почти нет причин устанавливать что-то нулевое или пытаться «освободить» его (понятие, которое не существует в JS), или сделайте что-нибудь еще, чтобы заставить GC что-либо сделать. Это просто отлично, спасибо вам большое. – 2014-12-25 06:59:49

Смежные вопросы