В 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 в кучке разных браузеров, которые относятся к вам. На все вопросы, связанные с производительностью, следует ответить на соответствующие испытания в реальном мире.