var variable = (condition) ? (true block) : (else block)
を実行することで、if/elseステートメントを1行で変数を設定できることはわかっていますが、else ifステートメントをそこに配置する方法があるかどうか疑問に思っていました。どんな提案でも感謝します、みんなありがとう!
もちろん、ネストされた三項演算子を実行できますが、読みにくいです。
var variable = (condition) ? (true block) : ((condition2) ? (true block2) : (else block2))
はい、次のことができます...If a then a、else b b if if c then c(b)、else b、else null
a ? a : (b ? (c ? c(b) : b) : null)
a
? a
: b
? c
? c(b)
: b
: null
インラインif-elseとして使用される三項演算子?:
は右結合です。つまり、これは右端の?
が最初に供給され、正確にone左側の最も近いオペランドとtwoをとることを意味します、右側に:
が付きます。
実際には、次のステートメントを考慮してください(上記と同じ):
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)
- 用語
a
が読み取られます。
ノード:a
- 非端末
?
が読み取られます。
ノード:a ?
- 用語
a
が読み取られます。
ノード:a ? a
- 非端末
:
が読み取られます。
ノード:a ? a :
- 用語
b
が読み取られます。
ノード:a ? a : b
- 非終端
?
が読み取られ、右結合規則がトリガーされます。連想性の決定:
node: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は、読みやすいように(およびshould)に書き換えることができます。
(インデントはnotであることに注意してください。ブラケット()が行うように正しいクロージャを暗黙的に定義します。)
a
? a
: b
? c
? c(b)
: b
: null
例えば
return a + some_lengthy_variable_name > another_variable
? "yep"
: "nop"
Mozilla:JavaScript条件演算子
Wiki:Operator Associativity
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 x = (day == "yes") ? "Good Day!" : (day == "no") ? "Good Night!" : "";
私はこれが古いスレッドであることを知っていますが、2セントを入れると思いました。三項演算子は次の方法でネストできます。
var variable = conditionA ? valueA : (conditionB ? valueB: (conditionC ? valueC : valueD));
例:
var answer = value === 'foo' ? 1 :
(value === 'bar' ? 2 :
(value === 'foobar' ? 3 : 0));
これは主に変数の割り当てに使用され、二項条件付けなどを使用します。
var time = Date().getHours(); // or something
var clockTime = time > 12 ? 'PM' : 'AM' ;
ElseIfはありません。開発のためにチェーンを使用しないで、switch
を使用できます。
a === "a" ? do something
: a === "b" ? do something
: do something
必要なだけ条件をチェーンできます。もしあなたがそうするなら:
var x = (false)?("1true"):((true)?"2true":"2false");
x="2true"
を取得します
したがって、次のように表現できます。
var variable = (condition) ? (true block) : ((condition)?(true block):(false block))