Условные определения объектов JavaScript - что лучше? - PullRequest
7 голосов
/ 09 июля 2010

Я сталкивался с двумя различными способами определения / именования объектов и функций в JavaScript, которые сначала проверяют наличие имени перед его использованием. Проблема в том, что я не знаю, какой из них лучше (с точки зрения скорости и удобства использования), и невозможно использовать логические операторы в поиске Google, чтобы выяснить это.

Первое, что я вижу чаще всего:

var myNewObject = myNewObject ? myNewObject : function () {
    // Code goes here.
};

Второй кажется более кратким, но я видел его только в одном или двух местах, поэтому я не знаю, существует ли стандарт или даже название для него:

var myNewObject = myNewObject || function() {
    // Code goes here.
};

Функционально, они оба делают одно и то же, и они оба работают в каждом браузере, в котором я могу протестировать. Мой вопрос - что лучше и почему? Кроме того, хотя первое определение по сути является однострочным условным ... как называется второе?

Ответы [ 5 ]

5 голосов
/ 09 июля 2010

Я бы использовал второй пример, который описывается как (Минимальный Eval). Это проще и кажется более читабельным.

Это похоже на получение события из метода onClick в нескольких браузерах.

element.onclick = function (evt) {
  evt = evt || window.event
}
5 голосов
/ 09 июля 2010

Я бы выбрал последнее, если бы только вы набрали myNewObject дважды, а не трижды.

Кроме того, хотя первое определение по сути является однострочным условным ... как называется второе определение?

Оценка короткого замыкания

2 голосов
/ 09 июля 2010

Последнее, это похоже на оператор слияния null в c # ?? при использовании таким образом

см .: Есть ли в JavaScript оператор "слияния нуль"

1 голос
/ 09 июля 2010

FWIW Я вижу второй подход чаще и (со своей стороны) чувствую, что он более четкий, лаконичный и идиоматичный.

0 голосов
/ 09 августа 2010

Оба метода работают. Но я думаю, что наиболее оптимизированная версия - это просто использовать обычный тест if, например:

if(!myNewObject)
   myNewObject = ...

Выполнение любого из методов, предложенных вами в ответе, может потребовать ненужного переназначения каждый раз, когда функция / объект уже определена. Я имею в виду, что если myNewObject уже определен, среда выполнения JavaScript должна будет выполнить ненужное переназначение myNewObject = myNewObject (если среда выполнения не оптимизирует его).

На веб-сайте Mozilla они предлагают использовать простое if, просмотреть это .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...