Когда я должен использовать delete vs setting elements to null в JavaScript? [дубликат]
Возможные Дубликаты:
удаление объектов в JavaScript
У меня есть объект JS, имеющий большое количество свойств. Если я хочу заставить браузер собирать мусор этого объекта, мне нужно установить каждое из этих свойств как null или мне нужно использовать оператор delete? В чем разница между ними?
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 и наоборот).
убедитесь, что вы удалите все ссылки и все будет хорошо.