Когда я должен использовать delete против установочных элементов в null в JavaScript? [Дубликат]

  

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

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

64 голоса | спросил jeffreyveon 22 TueEurope/Moscow2009-12-22T20:40:12+03:00Europe/Moscow12bEurope/MoscowTue, 22 Dec 2009 20:40:12 +0300 2009, 20:40:12

3 ответа


0

В 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
ответил Annabelle 22 TueEurope/Moscow2009-12-22T21:04:53+03:00Europe/Moscow12bEurope/MoscowTue, 22 Dec 2009 21:04:53 +0300 2009, 21:04:53
0

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

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

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

-m @

ответил Matt DiMeo 22 TueEurope/Moscow2009-12-22T21:44:09+03:00Europe/Moscow12bEurope/MoscowTue, 22 Dec 2009 21:44:09 +0300 2009, 21:44:09
0

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

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

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

ответил Gabriel McAdams 22 TueEurope/Moscow2009-12-22T20:50:48+03:00Europe/Moscow12bEurope/MoscowTue, 22 Dec 2009 20:50:48 +0300 2009, 20:50:48

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132