Je sais que vous pouvez définir des variables avec une ligne si / else déclarations en faisant var variable = (condition) ? (true block) : (else block)
var variable = (condition) ? (true block) : (else block)
, mais je me demandais s'il existait une façon de mettre une autre déclaration si là-dedans. Toute suggestion serait appréciée, merci à tous!
Bien sûr, vous pouvez faire des opérateurs ternaires imbriqués mais ils sont difficiles à lire.
var variable = (condition) ? (true block) : ((condition2) ? (true block2) : (else block2))
Oui, vous pouvez … Si a alors a, sinon si b puis si c alors c (b), sinon b, sinon nul
a ? a : (b ? (c ? c(b) : b) : null) a ? a : b ? c ? c(b) : b : null
Ternary operator ?:
Utilisé comme en ligne si-else est juste associatif . En bref, cela signifie que le plus à droite ?
Est alimenté en premier et il faut exactement un opérande le plus proche à gauche et deux , avec a :
à droite.
Pratiquement parlant, considérez la déclaration suivante (identique à ci-dessus) :
a ? a : b ? c ? c(b) : b : null
Le plus à droite ?
Se nourrit en premier, alors cherchez-le et contribuez-vous à l'élargissement de trois à l'autre ?
.
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)
- Le terme
a
est lu.
Nœud:a
- Non terminale
?
est lu.
Nœud:a ?
- Le terme
a
est lu.
Nœud:a ? a
a ? a
- Non terminel
:
est lu.
Nœud:a ? a :
a ? a :
- Le terme
b
est lu.
Nœud:a ? a : b
a ? a : b
- Non terminale
?
Est lu, déclenchant la règle de l'associativité de droite. L'associativité décide:
Nœud:a ? a : (b ?
a ? a : (b ?
- Le terme
c
est lu.
Nœud:a ? a : (b ? c
a ? a : (b ? c
- Non terminale
?
Est lu, en réappliquant la règle d'associativité de droite.
Nœud:a ? a : (b ? (c ?
a ? a : (b ? (c ?
- Le terme
c(b)
est lu.
Nœud:a ? a : (b ? (c ? c(b)
a ? a : (b ? (c ? c(b)
- Non terminel
:
est lu.
Nœud:a ? a : (b ? (c ? c(b) :
a ? a : (b ? (c ? c(b) :
- Le terme
b
est lu.
Nœud:a ? a : (b ? (c ? c(b) : b
a ? a : (b ? (c ? c(b) : b
- Non terminel
:
est lu. L'opérateur ternaire?:
de la portée précédente est satisfaite et la portée est fermée.
Nœud:a ? a : (b ? (c ? c(b) : b) :
a ? a : (b ? (c ? c(b) : b) :
- Le terme
null
est lu.
Nœud:a ? a : (b ? (c ? c(b) : b) : null
a ? a : (b ? (c ? c(b) : b) : null
- Pas de jetons à lire. Fermez les parenthèses ouvertes restantes.
Le résultat est:
a ? a : (b ? (c ? c(b) : b) : null)
a ? a : (b ? (c ? c(b) : b) : null)
Le léger Oneliner d'en haut pourrait (et devrait) être réécrit pour la lisibilité comme suit:
(Notez que l'indentation ne définit pas implicitement les fermetures correctes comme parenthèses () faire).
a ? a : b ? c ? c(b) : b : null
par exemple
return a + some_lengthy_variable_name > another_variable ? "yep" : "nop"
Mozilla: JavaScript conditionnel opérateur
Wiki: Associativité des opérateurs
Ceci est principalement utilisé pour affecter une variable, et il utilise un conditionnement binomial par exemple.
var time = Date().getHours(); // or something var clockTime = time > 12 ? 'PM' : 'AM' ;
Il n'y a pas d'ElseIf, pour des raisons de développement, n'utilisez pas de chaînage, vous pouvez utiliser un switch
qui est beaucoup plus rapide si vous avez plusieurs conditionnements dans .js
Je sais que c'est un vieux fil, mais j'ai pensé que j'aurais mis mes deux cents. Les opérateurs ternaires peuvent être imbriqués de la manière suivante:
var variable = conditionA ? valueA : (conditionB ? valueB: (conditionC ? valueC : valueD));
Exemple:
var answer = value === 'foo' ? 1 : (value === 'bar' ? 2 : (value === 'foobar' ? 3 : 0));
Vous pouvez chaîner autant de conditions que vous le souhaitez. Si tu fais:
var x = (false)?("1true"):((true)?"2true":"2false");
Vous obtiendrez x="2true"
Donc, cela pourrait s'exprimer comme suit:
var variable = (condition) ? (true block) : ((condition)?(true block):(false block))