关于条件运算符:Javascript一行如果… else … else if语句

Javascript one line If…else…else if statement

我知道通过执行var variable = (condition) ? (true block) : (else block)可以用一行if/else语句设置变量,但我想知道是否有一种方法可以将else-if语句放在其中。如有任何建议,我们将不胜感激,谢谢大家!


当然,可以使用嵌套的三元运算符,但它们很难读取。

1
var variable = (condition) ? (true block) : ((condition2) ? (true block2) : (else block2))


DR

是的,你可以…如果A那么A,如果B那么C(B),否则B,否则为空

1
2
3
4
5
6
7
8
9
a ? a : (b ? (c ? c(b) : b) : null)

a
  ? a
  : b
      ? c
        ? c(b)
        : b
      : null

较长版本

三元运算符?:用作内联,如果else是右相关的。简而言之,这意味着最右边的?首先被送入,它只需要左边的一个最接近的操作数,右边的两个操作数(带有:)。

实际上,考虑以下陈述(同上):

a ? a : b ? c ? c(b) : b : null

最右边的?首先被喂养,所以找到它和它周围的三个论点,然后连续地向左扩展到另一个?

1
2
3
4
5
6
7
8
9
   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)

计算机就是这样读的:

  • Term a is read.
    Node: a
  • Nonterminal ? is read.
    Node: a ?
  • Term a is read.
    Node: a ? a
  • Nonterminal : is read.
    Node: a ? a :
  • Term b is read.
    Node: a ? a : b
  • Nonterminal ? is read, triggering the right-associativity rule. Associativity decides:
    node: a ? a : (b ?
  • Term c is read.
    Node: a ? a : (b ? c
  • Nonterminal ? is read, re-applying the right-associativity rule.
    Node: a ? a : (b ? (c ?
  • Term c(b) is read.
    Node: a ? a : (b ? (c ? c(b)
  • Nonterminal : is read.
    Node: a ? a : (b ? (c ? c(b) :
  • Term b is read.
    Node: a ? a : (b ? (c ? c(b) : b
  • Nonterminal : is read. The ternary operator ?: from previous scope is satisfied and the scope is closed.
    Node: a ? a : (b ? (c ? c(b) : b) :
  • Term null is read.
    Node: a ? a : (b ? (c ? c(b) : b) : null
  • No tokens to read. Close remaining open parenthesis.

    Result is: a ? a : (b ? (c ? c(b) : b) : null)

  • 更好的可读性

    上面的难看的一行程序可以(也应该)改写为可读性:(请注意,缩进并不像括号()那样隐式定义正确的闭包。)

    1
    2
    3
    4
    5
    6
    7
    a
      ? a
      : b
          ? c
            ? c(b)
            : b
          : null

    例如

    1
    2
    3
    return a + some_lengthy_variable_name > another_variable
            ?"yep"
            :"nop"

    更多阅读

    mozilla:javascript条件运算符wiki:操作员关联性


    奖励:逻辑运算符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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

    在本例中使用逻辑运算符是丑陋和错误的,但这正是它们发光的地方…

    "空合并"

    1
    2
    3
    4
    5
    function(mayBeNull) {
      var cantBeNull = mayBeNull || 42             //"default" value
      var alsoCantBe = mayBeNull ? mayBeNull : 42  // ugly...
      ..
    }

    短路评估

    1
    2
    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!";


    我知道这是一条旧线,但我想我会把我的两分钱放进去。三元运算符可以按以下方式嵌套:

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

    例子:

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

    这主要用于分配变量,它使用二项式条件作用。

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

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

    没有其他的,为了开发不使用链,你可以使用switch,如果你在.js中有多个条件作用,这个速度会快得多。


    您可以根据需要链接任意多个条件。如果你这样做:

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

    你会得到x="2true"

    所以可以表示为:

    1
    var variable = (condition) ? (true block) : ((condition)?(true block):(false block))