Возможный дубликат:
Удаление объектов в JavaScriptУ меня есть объект JS, имеющий большое количество свойств. Если я хочу вынудить браузер собрать "мусор" этот объект, я должен установить каждое из этих свойств как пустой указатель, или я должен использовать оператор delete? Каково различие между двумя?
В 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
В JavaScript нет способа заставить сборку мусора в определенное время. Каждый JavaScript-движок имеет свой собственный способ работы с этим.
Однако, что вы можете сделать, так это убедиться, что на ваши объекты нигде не ссылаются. Установка их в нуль или удаление - это на самом деле одно и то же (удаление никогда не удаляет объект - удаляется только ссылка на него). Когда сборщик мусора все же запускается, он проверяет, нет ли ссылок на данный объект - если нет, то удаляет из памяти. Именно здесь происходит утечка памяти (JavaScript-объект ссылается на DOM-объект, и наоборот).
Убедитесь, что вы удалили все ссылки, и все будет в порядке.
.Свойства объектов Javascript обычно реализуются с помощью хэш-таблицы. Установка нуля оставляет ключ в хэш-таблице, указывая на нулевое значение, в то время как удаление удаляет и ключ, и значение.
Основное наблюдаемое различие между ними заключается в том, что если вы выполните итерацию по ключам с a for...in loop, то удаление ключей приводит к меньшему количеству записей, видимых при итерации.
Я бы предложил предпочесть удаление вообще, если только вы не собираетесь многократно устанавливать и очищать одни и те же ключи, что было бы аргументом в пользу того, чтобы оставить структуру хэш-таблицы на месте. Однако, любая разница в производительности между этими двумя методами будет неизмеримо мала в любом типичном случае.
-m@
.