0
点赞
收藏
分享

微信扫一扫

js一行If ... else ... else if语句


我知道你可以通过做​​var variable = (condition) ? (true block) : (else block)​​​来设置一行if / else语句的​​var variable = (condition) ? (true block) : (else block)​​​ ​​var variable = (condition) ? (true block) : (else block)​​ ,但我想知道是否有办法在其中放入else if语句。 任何建议,将不胜感激,谢谢大家!

当然,你可以做嵌套的三元操作符,但它们很难阅读。

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

TL;博士

是的,你可以...如果一个然后一个,否则如果B然后如果C然后C(B),否则B,否则空

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


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-?-2----:-3|
^ <-


|1-?|--2---------|:-3---|
^ <-
3.|1-?-2-????–3--------------------|

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

这就是计算机如何读取它:


  • 术语​​a​​被读取。
    节点: ​a​
  • 非终端​​?​​ 被阅读。
    节点: ​a ?​
  • 术语​​a​​被读取。
    节点: ​a ? a​ ​a ? a​
  • 非终结符​​:​​被读取。
    节点: ​a ? a :​ ​a ? a :​
  • 术语​​b​​被读取。
    节点: ​a ? a : b​ ​a ? a : b​
  • 非终端​​?​​ 被读取,触发右相关性规则。 相关性决定:
    节点: ​a ? a : (b ?​ ​a ? a : (b ?​
  • 术语​​c​​被读取。
    节点: ​a ? a : (b ? c​ ​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)​
  • 非终结符​​:​​被读取。
    节点: ​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​
  • 非终结符​​:​​被读取。 三元运算符​​?:​​从前一个范围满足,范围已关闭。
    节点: ​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) 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.

逻辑运算符
无结合
短路评估

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

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

var clockTime = time > 12 ? ‘PM’ : ‘AM’ ;

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




举报

相关推荐

0 条评论