Перезапись свойства объекта (другого объекта): должен ли я удалить старое?

#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'
  

Таким образом, сборщик мусора собирает (хотя это действительно принесет пользу, только если вы либо используете много свойств, либо часто используете этот объект).