Le code doit être lisible, donc être succinct ne doit pas signifier être laconique quel que soit le coût - pour cela, vous devez republier sur https://codegolf.stackexchange.com/ - donc à la place, je recommanderais d'utiliser une deuxième variable locale nommée index
pour maximiser la compréhension de la lecture ( avec un coût d'exécution minimal aussi, je note):
var index = someArray.indexOf( 3 );
var value = index == -1 ? 0 : index;
Mais si vous voulez vraiment réduire cette expression, parce que vous êtes un sadique cruel envers vos collègues ou collaborateurs de projet, alors voici 4 approches que vous pouvez utiliser:
1: variable temporaire dans une var
instruction
Vous pouvez utiliser la var
capacité de l' instruction pour définir (et affecter) une deuxième variable temporaire index
lorsqu'elle est séparée par des virgules:
var index = someArray.indexOf(3), value = index !== -1 ? index: 0;
2: Fonction anonyme auto-exécutable
Une autre option est une fonction anonyme auto-exécutable:
// Traditional syntax:
var value = function( x ) { return x !== -1 ? x : 0 }( someArray.indexOf(3) );
// ES6 syntax:
var value = ( x => x !== -1 ? x : 0 )( someArray.indexOf(3) );
3: opérateur virgule
Il existe également le tristement célèbre "opérateur virgule" pris en charge par JavaScript, qui est également présent en C et C ++.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator
Vous pouvez utiliser l'opérateur virgule lorsque vous souhaitez inclure plusieurs expressions dans un emplacement qui ne nécessite qu'une seule expression.
Vous pouvez l'utiliser pour introduire des effets secondaires, dans ce cas en le réaffectant à value
:
var value = ( value = someArray.indexOf(3), value !== -1 ? value : 0 );
Cela fonctionne car il var value
est interprété en premier (car il s'agit d'une instruction), puis l' value
affectation la plus à gauche, la plus intérieure , puis la main droite de l'opérateur virgule, puis l'opérateur ternaire - tout du JavaScript légal.
4: réassigner dans une sous-expression
Le commentateur @IllusiveBrian a souligné que l'utilisation de l'opérateur virgule (dans l'exemple précédent) est inutile si l'assignation à value
est utilisée comme sous-expression entre parenthèses:
var value = ( ( value = someArray.indexOf(3) ) !== -1 ? value : 0 );
Notez que l'utilisation de négatifs dans les expressions logiques peut être plus difficile à suivre pour les humains - donc tous les exemples ci-dessus peuvent être simplifiés pour la lecture en passant idx !== -1 ? x : y
à idx == -1 ? y : x
:
var value = ( ( value = someArray.indexOf(3) ) == -1 ? 0 : value );
if
and not anif/else