В Javascript, что более эффективно, удаление элемента или установка его на undefined явно
Скажем, что у меня есть ассоциативный массив Foo с ключом и значением xyz.
console.log(Foo['bar']);
>> xyz
delete Foo['bar'];
console.log Foo['bar'];
>> undefined
Foo['bar'] = 'xyz';
console.log(Foo['bar']);
>> xyz
Foo['bar'] = undefined;
console.log (Foo['bar']);
>> undefined
Мой вопрос: какой из двух более эффективен, они отличаются друг от друга? Есть ли сценарий, когда я должен использовать один над другим?
Спасибо!
Результаты:
Спасибо всем за помощь и показ мне jsperf. Установка этого параметра на undefined кажется (относительно) значительно быстрее, чем удаление, хотя все предостережения, указанные ниже, также очень интересны (на самом деле, вероятно, я буду использовать удаление многого, чтобы избежать будущих ошибок из левого поля).
Ответы
Ответ 1
Это приведет к отрицательной разнице в производительности в долгосрочной перспективе, поскольку b
по-прежнему считается свойством после последнего присвоения undefined
. Например:
var a = { b : 0 };
a.b = undefined;
a.hasOwnProperty("b");
>>> true
То же самое относится к ключевому слову in
("b" in a
is true), поэтому это скорее всего будет препятствовать итерации в части более крупного объекта.
Ответ 2
Я не оценил производительность этих операций (как я уже упоминал в комментарии, просто создайте небольшой ориентир на http://www.jsperf.com), но я потеряю несколько слов о различиях.
Вы всегда будете хороши в свойствах delete
ing, если их установить на undefined
или null
, это приведет к зависанию людей и/или кода, которые проверяются с помощью оператора IN
.
Как
if( 'bar' in Foo ) { }
все равно вернет true
, если вы установите Foo.bar
на undefined
. Это не произойдет, если вы перейдете с помощью delete Foo.bar
.
Ответ 3
Помните, что удаление свойства из объекта заменит это свойство одним и тем же именем, если оно существует в цепочке прототипов.
Установка свойства в значение null или undefined просто замаскирует его.
Ответ 4
Помимо бенчмаркинга фактического действия удаления или назначения на undefined
, вы также должны учитывать последствия будущей производительности использования объекта после его изменения.
Я могу думать о двух:
-
Как только свойство будет удалено, доступ к нему приведет к тому, что JavaScript будет выглядеть в цепочке прототипов, тогда как если свойство все еще существует на объекте (с undefined
значением), цепочка прототипов не будет искать.
-
Удаление свойства изменяет "форму объекта" и может повредить оптимизация JavaScript.
Ответ 5
Из ссылки, которую я прокомментировал:
Оператор удаления полностью удаляет свойство. Установка свойства для undefined удаляет значение. Установка свойства null приводит к изменению значение к нулевому значению.
Технически они не эквивалентны, но на практике они часто означает одно и то же: свойство не установлено.
Настройка объекта на null
была самой быстрой.
Некоторые хорошие ресурсы для понимания этих операций:
Ответ 6
Поскольку удаление свойства не делает то же самое программно, как установка его на undefined, это действительно зависит от того, какой результат программирования вы хотите.
delete Foo['bar'];
удаляет свойство bar
из объекта Foo
. Он не будет там, если кто-то повторит прямые свойства Foo
.
Foo['bar'] = undefined
устанавливает свойство undefined, но оно все еще существует в объекте и все еще будет там, но имеет значение undefined
.
Итак, если вы хотите избавиться от свойства, используйте delete
. Если вы хотите, чтобы свойство все еще было там, но имеет значение undefined
, а затем установите его на undefined
.
Если вы действительно хотите узнать, что является самым быстрым и почему-то не заботятся о разности программ, перейдите на jsperf.com, сделайте себе два тестовых примера сравнения и запустите jsperf в кучке разных браузеров, которые относятся к вам. На все вопросы, связанные с производительностью, следует ответить на соответствующие испытания в реальном мире.