Когда я должен использовать delete vs setting elements to null в JavaScript? [дубликат]


Возможные Дубликаты:
удаление объектов в JavaScript

У меня есть объект JS, имеющий большое количество свойств. Если я хочу заставить браузер собирать мусор этого объекта, мне нужно установить каждое из этих свойств как null или мне нужно использовать оператор delete? В чем разница между ними?

3 63

3 ответа:

нет никакого способа заставить сборку мусора в JavaScript, и вам это действительно не нужно. x.y = null; и delete x.y; как устранить xссылка на прежнее значение y. Значение будет собираться мусор, когда это необходимо.

если вы обнуляете свойство, оно по-прежнему считается "установленным" на объекте и будет перечислено. единственный раз, когда я могу думать о том, где вы предпочли бы delete если бы вы собирались перечислить свойства x.

рассмотрим следующее:

var foo = { 'a': 1, 'b': 2, 'c': 3 };

console.log('Deleted a.');
delete foo.a
for (var key in foo)
  console.log(key + ': ' + foo[key]);

console.log('Nulled out b.');
foo['b'] = null;
for (var key in foo)
  console.log(key + ': ' + foo[key]);

этот код будет производить следующий результат:

Deleted a.
b: 2
c: 3
Nulled out b.
b: null
c: 3

свойства объектов Javascript обычно реализуются с помощью хэш-таблицы. Установка значения null оставляет ключ в хэш-таблице, указывающей на нулевое значение, в то время как delete устраняет как ключ, так и значение.

основное заметное различие между ними заключается в том, что если вы перебираете ключи с помощью a for..in цикл, удаление ключей приводит к меньшему количеству записей, видимых итерацией.

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

- m@

в JavaScript нет способа принудительной сборки мусора в определенное время. Каждый движок JavaScript имеет свой собственный способ обработки этого.

Что вы можете сделать, хотя, убедитесь, что ваши объекты не ссылаются нигде. Установка их в null или удаление их на самом деле делает то же самое (delete никогда не удаляет объект - он только удаляет ссылку на него). Когда сборка мусора запускается, она проверяет, есть ли ссылки на данный объект - тогда, если нет, то он удаляет его из памяти. Здесь происходят утечки памяти (объект JavaScript ссылается на объект DOM и наоборот).

убедитесь, что вы удалите все ссылки и все будет хорошо.