Я знаю, что вы можете устанавливать переменные с помощью одной строки if/else, выполняя var variable = (condition) ? (true block) : (else block), но мне было интересно, есть ли способ поставить там else if. Любые предложения были бы оценены, спасибо всем!
Javascript одна строка Если... else... else if statement
Ответ 1
Конечно, вы можете делать вложенные троичные операторы, но их трудно читать.
var variable = (condition) ? (true block) : ((condition2) ? (true block2) : (else block2))
Ответ 2
ТЛ; др
Да, вы можете... Если a, то a, иначе, если b, то если c, то c (b), иначе b, еще ноль
a ? a : (b ? (c ? c(b) : b) : null)
a
? a
: b
? c
? c(b)
: b
: null
длинная версия
Тернарный оператор ?: Используется как встроенный, если-иначе является ассоциативным справа. Короче это значит что самый правый ? получает первый и получает только один ближайший операнд слева и два, с : справа.
На практике рассмотрим следующее утверждение (такое же, как указано выше):
a? a: b? c? c(b): b: null
Самый правый ? сначала накормить, так что найти его и окружающие его три аргумента и последовательно расширяться влево на другой ? ,
a ? a : b ? c ? c(b) : b : null
^ <---- RTL
1. |1-?-2----:-3|
^ <-
2. |1-?|--2---------|:-3---|
^ <-
3.|1-?-2-:|--3--------------------|
result: a ? a : (b ? (c ? c(b) : b) : null)
Вот как компьютеры читают это:
- Срок читается.
a
Узел:a- Нетерминал
?читается
Узел:a?- Срок читается.
a
Узел:a? aa? a- Нетерминал
:читается.
Узел:a? a :a? a :- Термин
bчитается.
Узел:a? a: ba? a: b- Нетерминал
?читается, вызывая правило правой ассоциативности. Ассоциативность решает:
узел:a? a: (b?a? a: (b?- Термин
cчитается.
Узел:a? a: (b? ca? a: (b? c- Нетерминал
?читается, повторно применяя правило правой ассоциативности.
Узел:a? a: (b? (c?a? a: (b? (c?- Термин
c(b)читается.
Узел:a? a: (b? (c? c(b)a? a: (b? (c? c(b)- Нетерминал
:читается.
Узел:a? a: (b? (c? c(b) :a? a: (b? (c? c(b) :- Термин
bчитается.
Узел:a? a: (b? (c? c(b): ba? a: (b? (c? c(b): b- Нетерминал
:читается. Тернарный оператор?:Из предыдущей области видимости выполняется, и область действия закрыта.
Узел:a? a: (b? (c? c(b): b) :a? a: (b? (c? c(b): b) :- Термин
nullчитается.
Узел:a? a: (b? (c? c(b): b): nulla? a: (b? (c? c(b): b): null- Нет жетонов для чтения. Закройте оставшиеся открытые скобки.
Результат: стоит
a? a: (b? (c? c(b): b): null)a? a: (b? (c? c(b): b): null)
Лучшая читаемость
Безобразный пользовательский текст сверху может (и должен) быть переписан для удобства чтения:
(Обратите внимание, что отступы не неявно определить правильные замыкания в скобках() делает.)
a
? a
: b
? c
? c(b)
: b
: null
например
return a + some_lengthy_variable_name > another_variable
? "yep"
: "nop"
Больше чтения
Mozilla: условный оператор JavaScript
Wiki: операторская ассоциативность
Бонус: логические операторы
var a = 0 // 1
var b = 20
var c = null // x=> {console.log('b is', x); return true} // return true here!
a
&& a
|| b
&& c
&& c(b) // if this returns false, || b is processed
|| b
|| null
Использование логических операторов, как в этом примере, уродливо и неправильно, но именно здесь они сияют...
"Нулевое слияние"
function(mayBeNull) {
var cantBeNull = mayBeNull || 42 // "default" value
var alsoCantBe = mayBeNull ? mayBeNull : 42 // ugly...
..
}
Оценка короткого замыкания
false && (anything) // is short-circuit evaluated to false.
true || (anything) // is short-circuit evaluated to true.
Логические операторы
Нулевое слияние
Оценка короткого замыкания
Ответ 3
Простыми словами:
var x = (day == "yes") ? "Good Day!" : (day == "no") ? "Good Night!" : "";
Ответ 4
Я знаю, что это старый поток, но я думал, что поставлю свои два цента. Тернарные операторы могут быть вложены следующим образом:
var variable = conditionA ? valueA : (conditionB ? valueB: (conditionC ? valueC : valueD));
Пример:
var answer = value === 'foo' ? 1 :
(value === 'bar' ? 2 :
(value === 'foobar' ? 3 : 0));
Ответ 5
Это используется в основном для назначения переменной, и она использует биномиальное кондиционирование, например.
var time = Date().getHours(); // or something
var clockTime = time > 12 ? 'PM' : 'AM' ;
Нет ElseIf, для разработки не используйте цепочку, вы можете использовать switch, что намного быстрее, если у вас есть несколько настроек в .js
Ответ 6
Вы можете объединить столько условий, сколько захотите. Если вы выполните:
var x = (false)?("1true"):((true)?"2true":"2false");
Вы получите x="2true"
Поэтому его можно было бы выразить как:
var variable = (condition) ? (true block) : ((condition)?(true block):(false block))
Ответ 7
a === "a" ? do something
: a === "b" ? do something
: do something