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;
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:
=
auquel la valeur de retour doit être attribuéex = 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';
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'; }
var x = condition || null;
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.
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'
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".
Qu'en est-il simplement
if (condition) { code if condition = true };