Ответ 1
Конечно, вы можете делать вложенные троичные операторы, но их трудно читать.
var variable = (condition) ? (true block) : ((condition2) ? (true block2) : (else block2))
Я знаю, что вы можете устанавливать переменные с помощью одной строки if/else, выполняя var variable = (condition) ? (true block) : (else block)
, но мне было интересно, есть ли способ поставить там else if. Любые предложения были бы оценены, спасибо всем!
Конечно, вы можете делать вложенные троичные операторы, но их трудно читать.
var variable = (condition) ? (true block) : ((condition2) ? (true block2) : (else block2))
Да, вы можете... Если 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? a
a? a
- Нетерминал
:
читается.
Узел:a? a :
a? a :
- Термин
b
читается.
Узел:a? a: b
a? a: b
- Нетерминал
?
читается, вызывая правило правой ассоциативности. Ассоциативность решает:
узел:a? a: (b?
a? a: (b?
- Термин
c
читается.
Узел:a? a: (b? c
a? 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): b
a? 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): 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)
Безобразный пользовательский текст сверху может (и должен) быть переписан для удобства чтения:
(Обратите внимание, что отступы не неявно определить правильные замыкания в скобках() делает.)
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.
Логические операторы
Нулевое слияние
Оценка короткого замыкания
Простыми словами:
var x = (day == "yes") ? "Good Day!" : (day == "no") ? "Good Night!" : "";
Я знаю, что это старый поток, но я думал, что поставлю свои два цента. Тернарные операторы могут быть вложены следующим образом:
var variable = conditionA ? valueA : (conditionB ? valueB: (conditionC ? valueC : valueD));
Пример:
var answer = value === 'foo' ? 1 :
(value === 'bar' ? 2 :
(value === 'foobar' ? 3 : 0));
Это используется в основном для назначения переменной, и она использует биномиальное кондиционирование, например.
var time = Date().getHours(); // or something
var clockTime = time > 12 ? 'PM' : 'AM' ;
Нет ElseIf, для разработки не используйте цепочку, вы можете использовать switch
, что намного быстрее, если у вас есть несколько настроек в .js
Вы можете объединить столько условий, сколько захотите. Если вы выполните:
var x = (false)?("1true"):((true)?"2true":"2false");
Вы получите x="2true"
Поэтому его можно было бы выразить как:
var variable = (condition) ? (true block) : ((condition)?(true block):(false block))
a === "a" ? do something
: a === "b" ? do something
: do something