2010-07-09 1 views
7

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

Первый я вижу чаще:

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

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

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

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

+0

второй более распространенный имхо. По крайней мере, для людей, которые знают язык ... – galambalazs

+0

Прохладный, кто-нибудь знает, работает ли это также с прототипом: т. Е. Array.prototype.forEach = Array.prototype.forEach || function (... Я спрашиваю, потому что на веб-сайте Mozilla они используют нормальный if (! Array.prototype.forEach) Array.prototype.forEach = function (... –

+0

@Marco Demaio Следуя той же логике, она должна * работать Я предлагаю похлопывать его по тестовому сценарию и видеть, если это так.Вы все еще определяете метод объекта ... он просто находится в определенном пространстве имен уже. – EAMann

ответ

5

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

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

Short-circuit evaluation

+2

Принимая это как ответ, так как вы также дали мне имя второго подхода. Это спасло бы столько времени, если бы я знал, как это называется ... Я не знал, что это законный подход, просто так оно и работает. – EAMann

1

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

5

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

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

element.onclick = function (evt) { 
    evt = evt || window.event 
} 
+1

+1 для примера – galambalazs

2

Последнее, это подобный оператору нуль Coalesce в C# ?? при использовании в этой манере

см: Is there a "null coalescing" operator in JavaScript?

+1

Обратите внимание, что это не полностью эквивалентно '??' в C#, оно вернет значение по умолчанию только тогда, когда его левое значение операнда будет 'null', в JavaScript' || 'будет делать это, когда его первый операнд будет * falsy *, ложный значения: 'null',' undefined', '0',' NaN', пустая строка и 'false'. – CMS

+0

@CMS, да, следовательно, ссылка для разъяснения. Я должен был написать, что это * аналогично * оператору '??' – CaffGeek

0

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

if(!myNewObject) 
    myNewObject = ... 

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

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

Смежные вопросы