Omettre la deuxième expression lors de l'utilisation du raccourci if-else

290

Puis-je écrire le if elseraccourci sans le else?

var x=1;

x==2 ? dosomething() : doNothingButContinueCode();   

J'ai remarqué que mettre nullpour les autres travaux (mais je n'ai aucune idée pourquoi ou si c'est une bonne idée).

Edit: Certains d'entre vous semblent perplexes pourquoi je prendrais la peine d'essayer cela. Soyez assuré que c'est purement par curiosité. J'aime jouer avec JavaScript.

Nikki
la source
Je pense qu'il y a une var | varsyntaxe. Attention car il est potentiellement difficile de "voir", en particulier les ternaires (OMI) étant problématiques. Utiliser avec parcimonie.
Jared Farrish
@JaredFarrish N'est-ce pas tout l'intérêt des ternaires qu'ils sont plus faciles à "voir" que d'utiliser des instructions if? De plus, quelle est cette syntaxe dont vous parlez, elle semble intéressante.
Hassan
1
Non, je ne pense pas que ce soit plus facile dans tous les cas. Le "point entier" dans mon esprit est de tout mettre sur une seule ligne ("mes codes plus courts que les vôtres") ou pour des cas littéraux spécifiques avec des résultats simplistes. L'empilement de ternaires est particulièrement pernicieux et doit être évité à tout prix. :)
Jared Farrish
1
@Hassan - J'ai vu quelque chose comme foo = bar | cat;, où si le premier est faux? null ?, il "tombe" à la seconde. Je l'ai seulement vu, cependant, et ne l'utilise pas.
Jared Farrish
3
@JaredFarrish: C'est a || bou a && b, sinon, bsera toujours évalué.
kennytm

Réponses:

263

C'est aussi une option:

x==2 && dosomething();

dosomething()ne sera appelé que s'il x==2est évalué comme vrai. C'est ce qu'on appelle un court-circuit .

Il n'est pas couramment utilisé dans des cas comme celui-ci et vous ne devriez vraiment pas écrire de code comme celui-ci. J'encourage cette approche plus simple:

if(x==2) dosomething();

Vous devez écrire du code lisible à tout moment; si vous êtes préoccupé par la taille du fichier, créez-en simplement une version réduite à l'aide de l'un des nombreux compresseurs JS. (par exemple, le compilateur de fermeture de Google )

ajax333221
la source
10
Oh, court-circuiter, c'est ça. La lisibilité du code est sous-estimée, je pense, dans la plupart des développeurs intermédiaires et certains "professionnels chevronnés".
Jared Farrish
2
Techniquement, vous n'avez pas besoin des accolades: if (1 - 1 === 0) $('.woot').text('Woot!'); j'utilise ce formulaire tout le temps avec PHP, et maintenant que j'adopte Coffeescript, je l'utilise aussi dans mon Javascript.
soyez hollenbeck le
5
Personnellement, je crois que si c'est un petit si avec un résultat si c'est vrai .. c'est plus rapide et plus facile à écrire x == 2 && dosomething ();
Dean Meehan
9
if x==2 && doSomething() || doSomethingElse()
Agustín
1
Je souhaite JavaScript inclus cette syntaxe Ruby comme: doSomething() if x === 2. Je ne manque pas Ruby, mais ça me manque.
Chad Johnson
743

Ce que vous avez est une utilisation assez inhabituelle de l' opérateur ternaire . Habituellement, il est utilisé comme une expression, pas une déclaration, à l'intérieur d'une autre opération, par exemple:

var y = (x == 2 ? "yes" : "no");

Donc, pour la lisibilité (parce que ce que vous faites est inhabituel), et parce que cela évite le "sinon" que vous ne voulez pas, je suggère:

if (x==2) doSomething();
Nicole
la source
Ici, nous pouvons ajouter une ligne de finition insérée en tant que commande complète (comme mon exemple utilise la fonction jquery fade in et fade out) x == 2? $ (élément) .fadeIn (): $ (élément) .fadeIn (); Il n'est pas obligatoire d'avoir une variable de retour (comme var y dans le premier code).
Prageeth godage
1
vous devez utiliser le triple "=" pour que la logique soit parfaite. comme dans var y = (x === 2? "yes": "no");
fino
63

Une autre option:

x === 2 ? doSomething() : void 0;
Buzinas
la source
3
Si quelqu'un ne sait pas pourquoi utiliser void 0, je suggère de lire ce lien
Carlinhos
20

Si vous ne faites pas le reste, pourquoi ne pas faire:

if (x==2) doSomething();
Prescott
la source
4
vous pouvez le faire même si vous faites le reste
nmirceac
14

L'utilisation nullest très bien pour l'une des branches d'une expression ternaire. Et une expression ternaire est très bien comme une déclaration en Javascript.

Cependant, si vous envisagez d'invoquer une procédure, il est plus clair d'écrire ceci en utilisant if..else:

if (x==2) doSomething;
else doSomethingElse

ou, dans votre cas,

if (x==2) doSomething;
Ted Hopp
la source
6

Petit ajout à ce très vieux fil ..

Si your'e évaluation d' une expression dans une for/ whileboucle avec un opérateur ternaire, et que vous souhaitez continueou breaken raison - vous allez avoir un problème parce que les deux continueet breakne sont pas des expressions , ils sont des déclarations sans aucune valeur.

Cela produira Uncaught SyntaxError: Unexpected token continue

 for (const item of myArray) {
      item.value ? break : continue;
 }

Si vous voulez vraiment une ligne unique qui retourne une déclaration, vous pouvez l'utiliser à la place:

  for (const item of myArray) {
      if (item.value) break; else continue;
  }
  • PS - Ce code pourrait soulever des sourcils. Je dis juste .. :)
DotBot
la source
4

Techniquement, mettre null ou 0, ou juste une valeur aléatoire , cela fonctionne (puisque vous n'utilisez pas la valeur de retour). Cependant, pourquoi utilisez-vous cette construction au lieu de la ifconstruction? Il est moins évident de savoir ce que vous essayez de faire lorsque vous écrivez du code de cette façon, car vous risquez de confondre les gens avec le no-op (null dans votre cas).

nhahtdh
la source
2

Probablement le plus court (basé sur l' opérateur OR et sa priorité )

x-2||dosomething()

Kamil Kiełczewski
la source