#javascript
#javascript
Вопрос:
Допустим, я делаю это:
const x = {
nestedObject: {
propertyOne: "nested obj1",
propertyTwo: "zzz"
}
};
И я хочу в конечном итоге перезаписать этот x.NestedObject — лучше ли сначала удалить старый с точки зрения памяти, или это не имеет значения? Например:
delete x.nestedObject;
x.nestedObject = {
propertyOne: "aaa",
propertyTwo: "bbb"
};
Является delete x.nestedObject
ли строка лучшей практикой или нет?
Комментарии:
1. Не имеет значения. Не оптимизируйте преждевременно.
Ответ №1:
Это не имеет никакого значения для памяти.
Если на вложенный объект нет ссылок в другом месте, он станет мусором, как только свойство будет переназначено, и сборщик мусора вернет память при следующем запуске. То же самое произойдет, если вы удалите свойство.
Удаление свойства или переменной необходимо только в том случае, если вы не собираетесь его переназначать и вам нужно освободить память, используемую его содержимым. Обычно это важно только в том случае, если содержимое большое или у вас их много (например, большой массив объектов).
Если вы собираетесь переназначить свойство позже, может быть предпочтительнее назначить null
свойство, а не удалять его, чтобы вы могли видеть пустое свойство в качестве заполнителя при отладке.
Комментарии:
1. » Удаление свойства или переменной необходимо только в том случае, если вы не собираетесь переназначать его в ближайшее время» Я бы даже сказал, что вам нужно удалять свойства только в том случае, если они не нужны для объекта. Объект, на который ссылается один, может быть предоставлен для GC, выполнив
obj.prop = null
, предполагая, что проблема с памятью. Он также служит маркером того, что свойство обычно должно быть там.2. @VLAZ Его удаление имеет дополнительное преимущество, заключающееся в том, что при отображении объекта не будет отображаться неиспользуемое свойство.
3. Да, именно поэтому я бы посоветовал сделать это, если вам больше не нужно это свойство. Если свойство обычно должно быть там, но оно будет переназначено позже в приложении, то пометьте его как
null
более подходящее. Если вам это больше не нужно — оно не будет переназначено или, по крайней мере, не обязательно и не надолго, тогда удалите его.
Ответ №2:
Вам не нужно ничего удалять, если вы перезаписываете одни и те же ключи.
const x = {
nestedObject: {
propertyOne: "nested obj1",
propertyTwo: "zzz"
}
};
console.log(x);
x.nestedObject = {
propertyOne: "a",
propertyTwo: "b"
}
console.log(x, 'after overwrite');
Ответ №3:
Это действительно не имеет значения. Если у вас одинаковые свойства в NestedObject, например, property1, property2, тогда все в порядке. Если вы создаете другие свойства, вы всегда можете присвоить этому свойству значение null.
x.property1 = null;
x.newProperty = 'whatever'
Таким образом, сборщик мусора собирает (хотя это действительно принесет пользу, только если вы либо используете много свойств, либо часто используете этот объект).