web-dev-qa-db-fra.com

Opérateurs ternaires en JavaScript sans "autres"

J'ai toujours dû mettre null dans les conditions secondaires qui n'ont rien. Y a-t-il un moyen de contourner? Par exemple.

condition ? x = true : null;

fondamentalement, y a-t-il un moyen de faire:

condition ? x = true;

Maintenant, il apparaît comme une erreur de syntaxe

Pour votre information, voici un exemple de code réel:

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;
116
Oscar Godson

Tout d’abord, une expression ternaire ne remplace pas une construction if/else, c’est un équivalent à une construction if/else qui retourne une valeur. C'est-à-dire qu'une clause if/else est un code, une expression ternaire est un expression, ce qui signifie qu'elle renvoie une valeur.

Cela signifie plusieurs choses:

  • utilisez des expressions ternaires uniquement lorsque vous avez une variable à gauche du = auquel la valeur de retour doit être attribuée
  • utilisez uniquement des expressions ternaires lorsque la valeur renvoyée doit être l'une des deux valeurs (ou utilisez des expressions imbriquées si cela convient)
  • chaque partie de l'expression (après? et après:) doit renvoyer une valeur sans effets secondaires (l'expression x = true renvoie true car toutes les expressions renvoient la dernière valeur, mais change également x sans que x n’affecte la valeur renvoyée.)

En bref, l’utilisation "correcte" d’une expression ternaire est

var resultofexpression = conditionasboolean ? truepart: falsepart;

Au lieu de votre exemple condition ? x=true : null ;, où vous utilisez une expression ternaire pour définir la valeur de x, vous pouvez utiliser ceci:

 condition && (x = true);

Ceci est toujours une expression et pourrait donc ne pas réussir la validation. Une approche encore meilleure serait alors:

 void(condition && x = true);

Le dernier passera la validation.

Mais là encore, si la valeur attendue est un booléen, utilisez simplement le résultat de l'expression de condition elle-même

var x = (condition); // var x = (foo == "bar");

UPDATE En ce qui concerne votre exemple, ceci est probablement plus approprié:

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';
191
Sean Kinsey

Non, il faut trois opérandes. C'est pourquoi ils sont appelés opérateurs ternaires .

Cependant, pour ce que vous avez comme exemple, vous pouvez faire ceci:

if(condition) x = true;

Bien qu'il soit plus sûr d'avoir des accolades si vous devez ajouter plusieurs instructions à l'avenir:

if(condition) { x = true; }

Edit: Maintenant que vous mentionnez le code dans lequel votre question s’applique:

if(!defaults.slideshowWidth)
    { defaults.slideshowWidth = obj.find('img').width()+'px'; }
18
In silico
var x = condition || null;
11
philfreo

Plus souvent, les opérateurs logiques sont utilisés pour raccourcir la syntaxe d'instruction:

!defaults.slideshowWidth &&
  (defaults.slideshowWidth = obj.find('img').width()+'px');

Mais dans votre cas particulier, la syntaxe peut être encore plus simple.

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

Ce code renverra la valeur defaults.slideshowWidth Si la valeur defaults.slideshowWidth Est évaluée à true et la valeur obj.find('img').width()+'px' sinon.

Voir le Evaluation de court-circuit des opérateurs logiques pour plus de détails.

9
Eugene Tiurin

Tu pourrais écrire

x = condition ? true : x;

Donc, x n'est pas modifié lorsque la condition est fausse.

Ceci est équivalent à

if (condition) x = true

MODIFIER:

!defaults.slideshowWidth 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : null 

Il y a quelques alternatives - je ne dis pas qu'elles sont meilleures/pires - simplement des alternatives

La transmission de la valeur null en tant que troisième paramètre fonctionne car la valeur existante est null. Si vous refactorisez et changez la condition, il y a un risque que cela ne soit plus vrai. Passer la valeur existante comme 2ème choix des gardes ternaires contre ceci:

!defaults.slideshowWidth = 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : defaults.slideshowwidth 

Plus sûr, mais peut-être pas aussi agréable à regarder, et plus de dactylographie. En pratique, j'écrirais probablement

defaults.slideshowWidth = defaults.slideshowWidth 
               || obj.find('img').width()+'px'
4
mdma

Dans votre cas, je considère l'opérateur ternaire comme redondant. Vous pouvez affecter la variable directement à l'expression à l'aide d'opérateurs ||.

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null ;

va devenir :

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

C'est plus clair, c'est plus de style "javascript".

2
Krasimir Kirilov

Qu'en est-il simplement

    if (condition) { code if condition = true };
0
Yandiro