Javascript одна строка Если... else... else if statement

Я знаю, что вы можете устанавливать переменные с помощью одной строки if/else, выполняя var variable = (condition) ? (true block) : (else block), но мне было интересно, есть ли способ поставить там else if. Любые предложения были бы оценены, спасибо всем!

Ответы

Ответ 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)

Вот как компьютеры читают это:

  1. Срок читается. a
    Узел: a
  2. Нетерминал ? читается
    Узел: a?
  3. Срок читается. a
    Узел: a? a a? a
  4. Нетерминал : читается.
    Узел: a? a : a? a :
  5. Термин b читается.
    Узел: a? a: b a? a: b
  6. Нетерминал ? читается, вызывая правило правой ассоциативности. Ассоциативность решает:
    узел: a? a: (b? a? a: (b?
  7. Термин c читается.
    Узел: a? a: (b? c a? a: (b? c
  8. Нетерминал ? читается, повторно применяя правило правой ассоциативности.
    Узел: a? a: (b? (c? a? a: (b? (c?
  9. Термин c(b) читается.
    Узел: a? a: (b? (c? c(b) a? a: (b? (c? c(b)
  10. Нетерминал : читается.
    Узел: a? a: (b? (c? c(b) : a? a: (b? (c? c(b) :
  11. Термин b читается.
    Узел: a? a: (b? (c? c(b): b a? a: (b? (c? c(b): b
  12. Нетерминал : читается. Тернарный оператор ?: Из предыдущей области видимости выполняется, и область действия закрыта.
    Узел: a? a: (b? (c? c(b): b) : a? a: (b? (c? c(b): b) :
  13. Термин null читается.
    Узел: a? a: (b? (c? c(b): b): null a? a: (b? (c? c(b): b): null
  14. Нет жетонов для чтения. Закройте оставшиеся открытые скобки.

    Результат: стоит 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