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)
Qwe*_*rty 33
是的,你可以...... 如果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)
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)
从上面的丑陋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)
简单来说:
var x = (day == "yes") ? "Good Day!" : (day == "no") ? "Good Night!" : "";
Run Code Online (Sandbox Code Playgroud)
这主要用于分配变量,它使用二项式条件,例如。
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)