Javascript一行If ... else ... else if statement

Sam*_*ter 49 javascript conditional-operator

我知道如果/ else语句可以用一行设置变量var variable = (condition) ? (true block) : (else block),但是我想知道是否有办法在那里放置else if语句.任何建议将不胜感激,谢谢大家!

Gre*_*ash 124

当然,你可以做嵌套的三元运算符,但它们很难阅读.

var variable = (condition) ? (true block) : ((condition2) ? (true block2) : (else block2))
Run Code Online (Sandbox Code Playgroud)

  • 是的,在这种情况下`if(){...} else if(){...} else {...}`可能更具可读性. (12认同)
  • 任何三元运算符都很难阅读。它们简洁而不具有描述性。甚至非程序员都知道if()else()可能意味着什么。 (2认同)

Qwe*_*rty 33

TL;博士

是的,你可以...... 如果a那么a,否则如果b那么如果c则c(b),否则b,否则为null

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

a
  ? a
  : b
      ? c
        ? c(b)
        : b
      : null
Run Code Online (Sandbox Code Playgroud)

更长的版本

?:用作内联if-else的三元运算符是右关联的.总之,这意味着最右边?被首先输送,它恰恰是一个在左边和最亲密的操作数2,用:,在右边.

实际上,请考虑以下声明(与上述相同):

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)
Run Code Online (Sandbox Code Playgroud)

这就是计算机读取它的方式:

  1. a读取术语.
    节点:a
  2. ?读取非终结符号.
    节点:a ?
  3. a读取术语.
    节点:a ? a
  4. :读取非终结符号.
    节点:a ? a :
  5. b读取术语.
    节点:a ? a : b
  6. ?读取非终结符,触发右关联性规则.相关性决定:
    节点:a ? a : (b ?
  7. c读取术语.
    节点:a ? a : (b ? c
  8. ?读取非终结符,重新应用右关联性规则.
    节点:a ? a : (b ? (c ?
  9. c(b)读取术语.
    节点:a ? a : (b ? (c ? c(b)
  10. :读取非终结符号.
    节点:a ? a : (b ? (c ? c(b) :
  11. b读取术语.
    节点:a ? a : (b ? (c ? c(b) : b
  12. :读取非终结符号.?:来自先前范​​围的三元运算符满足且范围已关闭.
    节点:a ? a : (b ? (c ? c(b) : b) :
  13. null读取术语.
    节点:a ? a : (b ? (c ? c(b) : b) : null
  14. 没有令牌可供阅读.关闭剩余的开括号.

    结果是: a ? a : (b ? (c ? c(b) : b) : null)

更好的可读性

从上面的丑陋oneliner可以(也应该)被改写为可读性为:
(注意,压痕并没有隐含地定义正确的关闭装置,如括号()做的.)

a
  ? a
  : b
      ? c
        ? c(b)
        : b
      : null
Run Code Online (Sandbox Code Playgroud)

例如

return a + some_lengthy_variable_name > another_variable
        ? "yep"
        : "nop"
Run Code Online (Sandbox Code Playgroud)

更多阅读

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
Run Code Online (Sandbox Code Playgroud)

在这个例子中使用逻辑运算符是丑陋和错误的,但这是他们闪耀的地方......

"空融合"

function(mayBeNull) {
  var cantBeNull = mayBeNull || 42             // "default" value
  var alsoCantBe = mayBeNull ? mayBeNull : 42  // ugly...
  ..
}
Run Code Online (Sandbox Code Playgroud)

短路评估

false && (anything) // is short-circuit evaluated to false.
true || (anything)  // is short-circuit evaluated to true.
Run Code Online (Sandbox Code Playgroud)

逻辑运算符
Null coalescence
短路评估


Mas*_*ood 7

简单来说:

var x = (day == "yes") ? "Good Day!" : (day == "no") ? "Good Night!" : "";
Run Code Online (Sandbox Code Playgroud)


Pio*_*ido 5

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

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

var clockTime = time > 12 ? 'PM' : 'AM' ;
Run Code Online (Sandbox Code Playgroud)

没有 ElseIf,为了开发,不要使用链接,switch如果您在 .js 中有多个条件,您可以使用哪个更快


小智 5

我知道这是一个旧线程,但我想我会投入我的两分钱。三元运算符能够以以下方式嵌套:

var variable = conditionA ? valueA : (conditionB ? valueB: (conditionC ? valueC : valueD));
Run Code Online (Sandbox Code Playgroud)

例子:

var answer = value === 'foo' ? 1 :
    (value === 'bar' ? 2 : 
        (value === 'foobar' ? 3 : 0));
Run Code Online (Sandbox Code Playgroud)


小智 5

如果别的:

a = b ? (true block) : (false block)
Run Code Online (Sandbox Code Playgroud)

如果-否则 如果-否则:

a = b ? (true block) : b = c ? (true block) : (false block)
Run Code Online (Sandbox Code Playgroud)

如果:

a = b && (true block)
Run Code Online (Sandbox Code Playgroud)

if-else-if(嵌套):

a = b ? (true block) : b = c && (true block)
Run Code Online (Sandbox Code Playgroud)
  • 注意想了这么多,直接实现看看结果,其中a、b、c是变量

  • 简单更好 (2认同)