Условные операторы в Javascript
Можно ли использовать условные операторы вроде оператора?
(x == y) ? alert("yo!") : alert("meh!");
Или более корректно использовать его для назначения значения таким образом?
z = (x == y) ? "yo!" : "meh!";
Если это не так, чтобы использовать его как инструкцию, то можно ли добавить несколько строк кода для выполнения так? Правильнее ли использовать команды ifthen и switch для нескольких строк кода?
(x == y) ? (alert("yo!"), document.write("woot!")) : (alert("meh!"), document.write("blah!"));
Ответы
Ответ 1
Условные операторы намеренно кратки и особенно полезны для назначений:
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();
В конце концов, как и многие вещи, это зависит от личных предпочтений. Всегда помните, что код, который вы пишете, не только для вас; другим разработчикам, возможно, придется пробираться через него в будущем; попробуйте сделать его максимально читаемым.
Ответ 2
JavaScript не помешает вам это сделать, но это очень необычная практика, которая смущает любого, кто читает ваш код.
Условный оператор почти всегда используется для выбора двух альтернативных значений, а не для операторов. Оператор if
является предпочтительным для условного разветвления операторов.
Что касается вашего последнего вопроса, да, если вы действительно должны, вы можете злоупотреблять конструкцией []
:
(x == y) ? [alert("yo!"), document.write("woot!")] : otherstuff();
Но, пожалуйста, не надо. 8 -)
Ответ 3
Это зависит только от вас, вы можете сделать это в любом случае. Вы просто должны спросить себя, однако, этот стиль соответствует руководящим принципам компании и насколько читаемым вы хотите, чтобы этот код был?
Использование операторов if является более читаемым.
Лично я использую только тернарный оператор для простых и быстрых истинно/ложных условий - там, где это имеет смысл, или где мне нужно что-то "встроенное".
Ответ 4
Любой из двух методов допустим, хотя вы могли бы также написать:
alert((x == y) ? "yo!" : "meh!");
Кроме того, я бы никогда не рекомендовал использовать inline-условие для многострочных операторов, просто используйте стандартный блок if/else. Учитывая, что введенный вами синтаксис недействителен JS, вы могли бы поместить несколько операторов в анонимные методы и yada yada, тогда вы входите в запутанный беспорядок почти неуправляемого и излишне сложного кода. Итак, снова стандартное if/else.
Ответ 5
Я согласен с Крисом и J-P, что:
- Условные операторы удобны для коротких операторов. Назначение переменной J-P - отличный пример:
var a = x ? 1 : 2;
- Предложения с несколькими предложениями должны быть разделены на отдельные строки для удобства чтения.
- Условные операторы могут быть считаны читаемыми как многострочные операторы с правильным отступом, но синтаксис
if/else
гораздо более знаком большинству разработчиков. Читаемость - это соответствие ожиданий вашего читателя, поэтому знакомство важно.
Я добавлю, что многострочные условные операторы оставляют вас открытыми для ошибок вставки точки с запятой. Ознакомьтесь с документацией JSLint (подробнее см. Раздел "Разрушение строк" ). Если вы должны использовать многострочный условный оператор, убедитесь, что операторы находятся в конце каждой строки. Я бы переработал многострочный пример J-P таким образом:
(something && somethingElse > 2) ?
doSomeLongFunctionName() :
doSomeOtherLongFunctionName();
Как уже упоминалось, существует множество руководств по стилю, и вы можете выбрать то, что вы предпочитаете. Однако некоторые варианты более подвержены ошибкам, чем другие. Определенно внимательно ознакомьтесь с тем, что документация JSLint; это очень продуманное руководство по стилю, и если вы придерживаетесь этого, вы даже можете использовать инструмент JSLint для автоматической проверки кода на наличие потенциальных проблем.