Javascript one line If…else…else if statement
我知道通过执行
当然,可以使用嵌套的三元运算符,但它们很难读取。
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 |
较长版本
三元运算符
实际上,考虑以下陈述(同上):
最右边的
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' ; |
没有其他的,为了开发不使用链,你可以使用
您可以根据需要链接任意多个条件。如果你这样做:
1 | var x = (false)?("1true"):((true)?"2true":"2false"); |
你会得到
所以可以表示为:
1 | var variable = (condition) ? (true block) : ((condition)?(true block):(false block)) |