Javascript une ligne Si … autrement … else if statement

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)) 

Tl dr

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 

Version plus longue

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) 

C'est ainsi que les ordinateurs le lisent:

  1. Le terme a est lu.
    Nœud: a
  2. Non terminale ? est lu.
    Nœud: a ?
  3. Le terme a est lu.
    Nœud: a ? a a ? a
  4. Non terminel : est lu.
    Nœud: a ? a : a ? a :
  5. Le terme b est lu.
    Nœud: a ? a : b a ? a : b
  6. 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 ?
  7. Le terme c est lu.
    Nœud: a ? a : (b ? c a ? a : (b ? c
  8. Non terminale ? Est lu, en réappliquant la règle d'associativité de droite.
    Nœud: a ? a : (b ? (c ? a ? a : (b ? (c ?
  9. Le terme c(b) est lu.
    Nœud: a ? a : (b ? (c ? c(b) a ? a : (b ? (c ? c(b)
  10. Non terminel : est lu.
    Nœud: a ? a : (b ? (c ? c(b) : a ? a : (b ? (c ? c(b) :
  11. Le terme b est lu.
    Nœud: a ? a : (b ? (c ? c(b) : b a ? a : (b ? (c ? c(b) : b
  12. 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) :
  13. Le terme null est lu.
    Nœud: a ? a : (b ? (c ? c(b) : b) : null a ? a : (b ? (c ? c(b) : b) : null
  14. 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)

Meilleure lisibilité

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" 

Plus de lecture

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))