2012-05-16 2 views
3

Скажем, у меня есть объект, который содержит другие объекты, как его свойства, какмусора Коллекция: свойства объекта

var obj = { 
    '1': {...}, 
    '42': {...} 
}; 

Когда obj выходит за рамки - сделать все вложенные объекты уничтожены или неявно мне нужно перебрать их и delete явно?

не
+2

Предполагая, что ничто иное не имело дескриптора для 'obj' или каких-либо из этих свойств, их в конечном итоге следует получить GC. Обычный подход заключается в том, чтобы убрать вещи на «null», а не удалять их. Будьте особенно осторожны при работе с узлами DOM, ссылки на них могут зависать, особенно в «серфирных браузерах». Особое внимание уделяйте циклическим ссылкам с объектами DOM (foo = document.body; document.body ['data-blah'] = foo). –

ответ

3

Да, если другая ссылка все еще существует:

var obj = { 
    '1': {...}, 
    '42': {...} 
}; 


var save = obj['1']; 

obj = null; 

После сбора мусора и не предполагая, что никаких других ссылок были созданы тогда пространства для OBJ и OBJ ['42' ] будет восстановлена, значение сохранено конечно, сохранится.

Mea culpa: как указано в комментариях delete obj в моем оригинале не действует с obj был объявлен как var. Had obj был глобальным и, следовательно, свойством глобального объекта, delete работал бы отлично. Чтобы эффективно удалить var, используйте obj = null. Одна вещь, которую я изучил, это было то, что delete оператор и возвращает true или false.

+0

Да, нет ничего, что относится к вложенным объектам. Спасибо – zerkms

+0

будет ли поведение одинаковым, если вместо 'delete obj;' я использую 'obj = {};'? – zerkms

+0

Почти в том, что присвоение нового значения obj удалит ссылку на литерал, но создает новый литерал. Присвоение ему значения 'undefined' лучше, поскольку оно не связано с созданием нового объекта только для удаления ссылки на старый. – chuckj

Смежные вопросы