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 indexpour 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 varinstruction
Vous pouvez utiliser la varcapacité de l' instruction pour définir (et affecter) une deuxième variable temporaire indexlorsqu'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 valueest interprété en premier (car il s'agit d'une instruction), puis l' valueaffectation 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 à valueest 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 );
ifand not anif/else