web-dev-qa-db-fra.com

Instruction JavaScript 'if' à une seule ligne - meilleure syntaxe, cette alternative?

Il a été clairement dit, bien que l’avis n’en reste pas moins, que le fait d’abandonner des accolades sur une seule déclaration if n’est pas idéal pour la maintenabilité et la lisibilité.

Mais qu'en est-il?

if (lemons) { document.write("foo gave me a bar"); }

C'est encore plus compressé, et si élargi, les accolades ne seront pas oubliées. Y a-t-il des problèmes flagrants, et si non, quelles sont les considérations? J'ai l'impression que c'est toujours très lisible, au moins autant qu'un opérateur ternaire de toute façon. Il me semble que les opérateurs ternaires ne sont pas autant suggérés pour des raisons de lisibilité, bien que cette conclusion ne soit pas aussi unanime.

Le jumeau diabolique en moi veut suggérer ceci, bien que la syntaxe ne soit évidemment pas faite pour cela, et qu’elle n’est probablement qu’une mauvaise idée.

(syntax) ? document.write("My evil twin emerges"): "";
137
David Hobs

J'ai vu le comportement de l'opérateur && en court-circuit utilisé pour y parvenir, bien que les personnes qui ne sont pas habituées à cela puissent avoir du mal à lire ou même appeler cela un anti-motif:

lemons && document.write("foo gave me a bar");  

Personnellement, je vais souvent utiliser if sur une seule ligne sans crochets, comme ceci:

if (lemons) document.write("foo gave me a bar");

Si je dois ajouter d'autres déclarations, je les mettrai à la ligne suivante et ajouterai des crochets. Étant donné que mon IDE applique une indentation automatique, les objections de maintenabilité à cette pratique sont sans objet.

237
Peter Olson

Je l'utilise comme ça:

(lemons) ? alert("please give me a lemonade") : alert("then give me a beer");
103
asael2

Vous pouvez utiliser ce format, qui est couramment utilisé en PHP:

(lemon) ? document.write("foo gave me a bar") : document.write("if condition is FALSE");
34
Macro

// Un autre exemple simple

 var a = 11;
 a == 10 ? alert("true") : alert("false");
13
user3413838

Cette ligne est beaucoup plus propre.

if(dog) alert('bark bark');

Je préfère ça. j'espère que ça aide quelqu'un

12
shakee93

peut utiliser cela, 

lemons ? alert("please give me a lemonade") : alert("then give me a beer");

explication: si lemons existe alors donnez-moi une alerte ("donnez-moi s'il vous plaît une limonade") else alert ("alors donnez-moi une bière") 

4

Comme beaucoup de gens l'ont dit, si vous cherchez une ligne réelle si:

    if (Boolean_expression) do.something();

est préféré. Cependant, si vous cherchez à faire un if/else alors ternary est votre ami (et aussi super cool):

    (Boolean_expression) ? do.somethingForTrue() : do.somethingForFalse();

ÉGALEMENT:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

Cependant, j'ai vu un exemple très cool. Merci à @ Peter-Oslson pour &&

    (Boolean_expression) && do.something();

Enfin, il ne s’agit pas d’une instruction if, mais l’exécution d’une tâche en boucle avec un mappage/réduction ou Promise.resolve () est également amusante. Cris à @brunettdan

3
Kemacal

Exemple dans les fonctions de flèche:

let somethingTrue = true
[1,2,3,4,5].map(i=>somethingTrue && i*2)

En promesses:

Promise.resolve()
  .then(_=>checkTrueFalse && asyncFunc())
  .then(_=>{ .. })

Autrement:

if(somethingTrue) thenDo()

Si c'est simplement une simple condition, je préfère utiliser if (valeur) chaque fois que cela est possible car le mot if au début de la déclaration en dit plus sur ce qui se passe que la parenthèse et les points d'interrogation.

2
brunettdan

Cela peut aussi être fait en utilisant une seule ligne avec while boucles et if comme ceci:

if (blah)
    doThis();

Cela fonctionne aussi avec les boucles while.

2
Noitidart

Comme cela a déjà été dit, vous pouvez utiliser:

&& style

lemons && document.write("foo gave me a bar");  

ou 

style sans parenthèse

if (lemons) document.write("foo gave me a bar");

retour de court-circuit

Si, toutefois, vous souhaitez utiliser l'instruction if d'une ligne pour court-circuiter une fonction, vous devez utiliser la version sans crochet de la manière suivante:

if (lemons) return "foo gave me a bar";

comme 

lemons && return "foo gave me a bar"; // does not work!

vous donnera un SyntaxError: Unexpected keyword 'return'

0
Marc

J'ai vu de nombreuses réponses avec de nombreux votes en faveur de l'utilisation de l'opérateur ternaire. Le ternaire est génial si a) vous avez une option alternative et b) vous renvoyez une valeur assez simple à partir d'une condition simple. Mais...

La question initiale n'avait pas d'alternative et l'opérateur ternaire ne possédant qu'une seule branche (réelle) vous oblige à renvoyer une réponse configurée.

lemons ? "foo gave me a bar" : "who knows what you'll get back"

Je pense que la variation la plus courante est lemons ? 'foo...' : '', et, comme vous le constaterez en lisant la myriade d'articles pour toutes les langues sur vrai, faux, vérité, falsey, nul, nul, vide, vide (avec notre sans? ), vous entrez dans un champ de mines (bien qu’un champ de mines bien documenté.)

Dès qu'une partie du ternaire se complique, il vaut mieux utiliser une forme plus explicite de conditionnel.

Un long chemin pour dire que je vote pour if (lemons) "foo".

0
Anita Graham
**Old Method:**
if(x){
   add(x);
}
New Method:
x && add(x);

Même assigner opération nous pouvons aussi faire avec des parenthèses rondes

exp.includes('regexp_replace') && (exp = exp.replace(/,/g, '@&'));
0
Sajith Mantharath