Когда я должен использовать delete vs set elements для null в JavaScript?

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

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

Ответ 1

Невозможно принудительно собрать сборку мусора в 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

Ответ 2

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

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

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

-m @

Ответ 3

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

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

Убедитесь, что вы удалите все ссылки, и все будет в порядке.