Вопрос по javascript, conditional-operator – JavaScript одна строка If ... еще ... еще, если заявление

36

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

Это не if..else. Это троичный оператор. Almo
Вложенный троичный оператор - это то, что вы описываете. Похоже, это отвечает на вопрос:stackoverflow.com/questions/10526739/... lwalden

Ваш Ответ

6   ответов
2

и это использует биномиальное кондиционирование, например.

var time = Date().getHours(); // or something

var clockTime = time > 12 ? 'PM' : 'AM' ;

ElseIf не существует, для развития не используйте цепочки, вы можете использоватьswitch что намного быстрее, если у вас есть несколько условий в .js

1

var x = (false)?("1true"):((true)?"2true":"2false");

Ты получишьx="2true"

Так что это можно выразить как:

var variable = (condition) ? (true block) : ((condition)?(true block):(false block))
29
ТЛ; др

Да, ты можешь... Если a, то a, иначе, если b, то если c, то c (b), иначе b, иначе ноль


a
  ? a
  : b
      ? c
        ? c(b)
        : b
      : null
длинная версия

Тернарный оператор?: используется как встроенный if-elseправо ассоциативный, Короче говоря это означает, что самый правый? кормит первым, и это занимает ровноодин ближайший операнд слева идвас:, справа.

На практике рассмотрим следующее утверждение(так же, как и выше):

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нетерминальные? читается
Узел:a ?Срокa читается
Узел:a ? aнетерминальные: читается
Узел:a ? a :Срокb читается
Узел:a ? a : bнетерминальные? читается, вызывая правило правой ассоциативности. Ассоциативность решает:
узел: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) :Срок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

например

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.

Логические операторы
Нулевое слияние
Оценка короткого замыкания

1

Простыми словами:

var x = (day == "yes") ? "Good Day!" : (day == "no") ? "Good Night!";
@fyllepo Спасибо Masood Aslami
Нет, ваш синтаксис неверен, вы пропускаете: на вашем вложенном троичном утверждении. Тест в браузере ... fyllepo
@Masood_Aslami спасибо за исправление. Я проголосовал. fyllepo
@fyllepo Теперь я исправил это, спасибо. Masood Aslami
3

что это старая ветка, но я подумал, что я бы вложил в нее два цента. Тернарные операторы могут быть вложены следующим образом:

var variable = conditionA ? valueA : (conditionB ? valueB: (conditionC ? valueC : valueD));

Пример:

var answer = value === 'foo' ? 1 :
    (value === 'bar' ? 2 : 
        (value === 'foobar' ? 3 : 0));
97

вы можете делать вложенные троичные операторы, но их трудно читать.

var variable = (condition) ? (true block) : ((condition2) ? (true block2) : (else block2))
Да, в этом случаеif() { ... } else if() { ... } else { ... } вероятно, более читабелен. Spencer Wieczorek
Любые троичные операторы трудно читать. Они краткие и не описательные. Даже не программисты имеют представление о том, что может означать if () else (). Almo

Похожие вопросы