Il codice dovrebbe essere leggibile, quindi essere succinti non dovrebbe significare essere conciso a qualsiasi costo - per questo dovresti ripubblicare su https://codegolf.stackexchange.com/ - quindi invece consiglierei di utilizzare una seconda variabile locale denominata indexper massimizzare la comprensibilità di lettura ( anche con un costo di runtime minimo, noto):
var index = someArray.indexOf( 3 );
var value = index == -1 ? 0 : index;
Ma se vuoi davvero ridurre questa espressione, perché sei un sadico crudele per i tuoi colleghi o collaboratori del progetto, allora ecco 4 approcci che potresti usare:
1: variabile temporanea in varun'istruzione
È possibile utilizzare la varcapacità dell'istruzione di definire (e assegnare) una seconda variabile temporanea indexse separata da virgole:
var index = someArray.indexOf(3), value = index !== -1 ? index: 0;
2: funzione anonima autoeseguibile
Un'altra opzione è una funzione anonima autoeseguibile:
// 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: operatore virgola
C'è anche il famigerato "operatore virgola" supportato da JavaScript, che è presente anche in C e C ++.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator
È possibile utilizzare l'operatore virgola quando si desidera includere più espressioni in una posizione che richiede una singola espressione.
Puoi usarlo per introdurre effetti collaterali, in questo caso riassegnando a value:
var value = ( value = someArray.indexOf(3), value !== -1 ? value : 0 );
Funziona perché var valueviene interpretato prima (poiché è un'istruzione), quindi l' valueassegnazione più a sinistra, più interna , e poi la mano destra dell'operatore virgola, e poi l'operatore ternario - tutto JavaScript legale.
4: riassegna in una sottoespressione
Il commentatore @IllusiveBrian ha sottolineato che l'uso dell'operatore virgola (nell'esempio precedente) non è necessario se l'assegnazione a valueè usata come sottoespressione tra parentesi:
var value = ( ( value = someArray.indexOf(3) ) !== -1 ? value : 0 );
Nota che l'uso di negativi nelle espressioni logiche può essere più difficile da seguire per gli esseri umani, quindi tutti gli esempi sopra possono essere semplificati per la lettura cambiando idx !== -1 ? x : yin idx == -1 ? y : x:
var value = ( ( value = someArray.indexOf(3) ) == -1 ? 0 : value );
ife non anif/else