Условные операторы в Javascript - PullRequest
18 голосов
/ 15 мая 2009

Можно ли использовать условные операторы как операторы вроде этого?

(x == y) ? alert("yo!") : alert("meh!");

Или правильнее использовать его для присвоения значения, подобного этому?

z = (x == y) ? "yo!" : "meh!";

Если не неправильно использовать его как оператор, тогда возможно ли добавить более одной строки кода для выполнения, как это? Правильнее ли использовать ifthen и переключать операторы для нескольких строк кода?

(x == y) ? (alert("yo!"), document.write("woot!")) : (alert("meh!"), document.write("blah!"));

Ответы [ 5 ]

25 голосов
/ 15 мая 2009

Условные операторы намеренно лаконичны и особенно полезны для назначений:

var a = x ? 1 : 2;

Использование их для условного запуска функций, когда это возможно, должно быть сделано для удобства чтения с использованием операторов IF / ELSE:

// This is possible but IMO not best practice:
X ? doSomething() : doSomethingElse();

В большинстве случаев это лучшее решение:

if (X) {
    doSomething();
} else {
    doSomethingElse();
}

Одним заметным преимуществом структуры IF / ELSE является то, что вы можете добавлять дополнительные задачи в каждое условие с минимальными хлопотами.

Ваш последний фрагмент также возможен, но выглядит несколько скучно и, опять же, может быть лучше приспособлен к более обычной логической структуре; как блок IF / ELSE.

Тем не менее, условный оператор все еще может быть читаемым, например,

(something && somethingElse > 2) ?
   doSomeLongFunctionName()
   : doSomeOtherLongFunctionName();

В конце концов, как и многие вещи, все зависит от личных предпочтений. Всегда помните, что код, который вы пишете, не только для вас; другим разработчикам, возможно, придется пройти через это в будущем; постарайтесь сделать его максимально читабельным.

4 голосов
/ 15 мая 2009

JavaScript не помешает вам сделать это, но это очень необычная практика, которая запутает любого, кто читает ваш код.

Условный оператор почти всегда используется для выбора двух альтернативных значений, а не операторов. Оператор if предпочтителен для условного перехода операторов.

Что касается вашего последнего вопроса, да, если вы действительно должны это сделать, вы можете использовать конструкцию []:

(x == y) ? [alert("yo!"), document.write("woot!")] : otherstuff();

Но, пожалуйста, не надо. 8 -)

4 голосов
/ 15 мая 2009

Это зависит только от вас, вы можете сделать это в любом случае. Вы просто должны спросить себя, соответствует ли этот стиль правилам компании и насколько читабельным должен быть этот код?

Использование операторов if более читабельно.

Лично я использую троичный оператор только для простых и быстрых истинных / ложных условий - где это имеет смысл - или где мне нужно что-то "встроенное".

2 голосов
/ 16 мая 2009

Я согласен с Крисом и J-P, что:

  1. Условные операторы удобны для коротких операторов. Присвоение переменной J-P является отличным примером: var a = x ? 1 : 2;
  2. Для удобства чтения предложения, состоящие из нескольких операторов, должны быть разделены на отдельные строки.
  3. Условные операторы можно сделать читаемыми в виде многострочных операторов с правильным отступом, но синтаксис if/else гораздо более знаком большинству разработчиков. Читаемость означает соответствие ожиданиям вашего читателя, поэтому знакомство важно.

Я добавлю, что многострочные условные операторы оставляют вас открытыми для ошибок вставки точек с запятой. Ознакомьтесь с документацией JSLint (см. Раздел «Разрыв строки»), чтобы узнать больше об этом. Если вам необходимо использовать многострочный условный оператор, убедитесь, что операторы находятся в конце каждой строки. Я бы переработал многострочный пример J-P таким образом:

(something && somethingElse > 2) ?
   doSomeLongFunctionName() :
   doSomeOtherLongFunctionName();

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

2 голосов
/ 15 мая 2009

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

alert((x == y) ? "yo!" : "meh!");

Кроме того, я бы никогда не рекомендовал использовать встроенные условные выражения для многострочных операторов, просто используйте стандартный блок if / else. Ввиду того, что введенный вами синтаксис недопустим в JS, вы могли бы поместить несколько операторов в анонимные методы и yada yada, а затем войти в запутанный беспорядок почти неуправляемого и излишне сложного кода. Итак, еще раз, стандартный, если / иначе.

...