Когда должен я использовать удалить по сравнению с установкой в NULL элементов в JavaScript? [дубликат]

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

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

66
задан Community 23 May 2017 в 11:47
поделиться

3 ответа

В JavaScript нет возможности принудительно собирать мусор, и на самом деле в этом нет необходимости. x.y = нуль; и удалить 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
149
ответ дан 24 November 2019 в 14:52
поделиться

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

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

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

.
1
ответ дан 24 November 2019 в 14:52
поделиться

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

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

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

-m@

.
17
ответ дан 24 November 2019 в 14:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: