Есть ли существенная разница в выполнении любого из этих?
delete a.x;
против
a.x = undefined;
где
a = {
x: 'boo'
};
Можно ли сказать, что они эквивалентны?
(Я не принимаю во внимание такие вещи, как «V8 любит не использовать delete
лучше» )
javascript
bevacqua
источник
источник
undefined
значение, которое все еще является ..Ответы:
Они не эквивалентны. Основное отличие заключается в том, что настройка
означает, что
a.hasOwnProperty("x")
все еще вернет true, и, следовательно, он все равно будет отображаться вfor in
цикле, и вObject.keys()
означает, что
a.hasOwnProperty("x")
вернет falseТо, что они одинаковы, заключается в том, что вы не можете определить, существует ли свойство путем тестирования
Что вы не должны делать, если вы пытаетесь определить, существует ли свойство, вы всегда должны использовать
Следуя цепочке прототипов (упомянутой zzzzBov ), вызов
delete
позволит ему идти вверх по цепочке прототипов, тогда как установка значения в undefined не будет искать свойство в цепочечных прототипах http://jsfiddle.net/NEEw4/1/Удаление унаследованных свойств Если свойство, которое вы пытаетесь удалить, наследуется, оно
delete
не повлияет на него. То естьdelete
удаляет только свойства самого объекта, а не наследуемые свойства.Следовательно, если вам нужно убедиться, что значение объекта будет неопределенным, оно
delete
не будет работать, когда свойство наследуется, вам придется установить (переопределить) егоundefined
в этом случае. Если место, которое проверяет его, не будет использоватьсяhasOwnProperty
, но, вероятно, было бы небезопасно предполагать, что везде, где оно проверяет, оно будет использоватьhasOwnProperty
источник
"x" in a
также вернетсяtrue
с первым иfalse
со вторым. ВыходObject.keys
также будет отличаться.undefined
, вы также можете просто проверитьif (a.x)
, если только он не для чисел и 0 действителенПерефразируя вопрос:
Нет.
Первый удаляет ключ из переменной, второй устанавливает ключ со значением
undefined
. Это имеет значение при переборе свойств объектов и приhasOwnProperty
использовании.Кроме того, это существенно повлияет на цепочку прототипов.
источник
delete
позволив ему подняться по цепочке прототиповЕсли
a.x
является установочной функцией,a.x = undefined
вызовет функцию, тогда какdelete a.x
не вызовет функцию.источник
Да, есть разница. Если вы используете
delete a.x
x, это больше не свойство a, но если вы используетеa.x=undefined
это свойство, но его значение не определено.источник
Имена немного сбивают с толку.
a.x = undefined
просто устанавливает свойство вundefined
, но свойство все еще там:delete
фактически удаляет его:источник
Этот REPL от узла должен иллюстрировать разницу.
источник
Я уверен, что вы можете увидеть разницу между
var o1 = {p:undefined};
иvar o2 = {};
.В обоих случаях
o.p
будет,undefined
но в первом случае это потому, что это значение, а во втором - потому что значения нет .delete
это оператор , который позволяет получить изo1
(или другой объект , который имеет значение , присвоенное егоp
имущества) кo2
таким образом:delete o1.p;
.Обратная операция выполняется простым присвоением значения (
undefined
в этом примере, но это может быть что-то еще) свойствуo1.p = undefined;
.Так что нет , они не эквивалентны.
delete o.p;
воляудалить свойство
p
из объекта, если оно естьничего не делать иначе
o.p = undefined;
волядобавить свойство
p
к объекту, если у него его еще нет, и установить его значениеundefined
просто измените значение свойства, если оно уже есть у объекта
С точки зрения производительности,
delete
это плохо, потому что он изменяет структуру объекта (как добавление нового свойства, если вы не инициализировали его в конструкторе).Принимая во внимание, что установка значения также
undefined
освобождает содержимое, но без принуждения изменять структуру.источник
Объект - это просто древовидное представление, то есть в памяти корень указывает на различные области памяти, где хранятся ключи этого объекта. и это местоположение указывает на другое место, где хранится фактическое значение этого ключа, или места, где хранятся дочерние ключи, или места, где хранятся значения массива.
Когда вы удаляете любой ключ из объекта, используя delete, фактически он удаляет связь между этим ключом и его родительским объектом, и ячейки памяти в ключе и его значение освобождаются для хранения другой информации.
Когда вы пытаетесь удалить любой ключ, задав в качестве значения значение undefined, вы просто устанавливаете его значение, а не удаляете этот ключ. Это означает, что область памяти ключей все еще связана с его родительским объектом и значением, если ключ не определен.
Использование undefined вместо ключевого слова delete является плохой практикой, поскольку оно не освобождает место в памяти этого ключа.
Даже если ключ отсутствует, и вы установите его как неопределенный, тогда этот ключ будет создан со значением
undefined
.например
Удалить невозможно с унаследованными свойствами, потому что это свойство не является частью этого дочернего объекта.
источник
as a general rule of thumb, using 'delete' makes thing slower.
и developers.google.com/v8/designTo reduce the time required to access JavaScript properties, V8 does not use dynamic lookup to access properties. Instead, V8 dynamically creates hidden classes behind the scenes. In V8, an object changes its hidden class when a new property is added.
, и, наконец, smashingmagazine.com/2012/11/…Используя массив вместо объекта, я могу продемонстрировать, что при удалении используется меньше динамической памяти, чем не определено.
Например, этот код не будет завершен:
Это выдает эту ошибку:
Итак, как видите, на
undefined
самом деле занимает кучу памяти.Однако, если вы также
delete
используете ary-item (вместо того, чтобы просто установить егоundefined
), код будет медленно завершаться:Это крайние примеры, но они указывают на
delete
то, что я нигде не видел упоминаний.источник