El código debe ser legible, por lo que ser conciso no debe significar ser conciso sea cual sea el costo, para eso debe volver a publicar en https://codegolf.stackexchange.com/ , por lo que recomendaría usar una segunda variable local nombrada index
para maximizar la comprensión de lectura ( con un costo mínimo de tiempo de ejecución también, observo):
var index = someArray.indexOf( 3 );
var value = index == -1 ? 0 : index;
Pero si realmente desea reducir esta expresión, porque es un sádico cruel con sus compañeros de trabajo o colaboradores del proyecto, aquí hay 4 enfoques que puede usar:
1: variable temporal en una var
declaración
Puede usar la var
capacidad de la declaración para definir (y asignar) una segunda variable temporal index
cuando se separa con comas:
var index = someArray.indexOf(3), value = index !== -1 ? index: 0;
2: función anónima autoejecutable
Otra opción es una función anónima autoejecutable:
// 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: operador de coma
También está el infame "operador de coma" que admite JavaScript, que también está presente en C y C ++.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator
Puede utilizar el operador de coma cuando desee incluir varias expresiones en una ubicación que requiera una sola expresión.
Puede usarlo para introducir efectos secundarios, en este caso reasignándolo a value
:
var value = ( value = someArray.indexOf(3), value !== -1 ? value : 0 );
Esto funciona porque var value
se interpreta primero (como una declaración), y luego el más a la izquierda, el más internovalue
asignación , y luego la parte derecha del operador de coma, y luego el operador ternario, todo JavaScript legal.
4: reasignar en una subexpresión
El comentarista @IllusiveBrian señaló que el uso del operador de coma (en el ejemplo anterior) no es necesario si la asignación a value
se usa como una subexpresión entre paréntesis:
var value = ( ( value = someArray.indexOf(3) ) !== -1 ? value : 0 );
Tenga en cuenta que el uso de negativos en expresiones lógicas puede ser más difícil de seguir para los humanos, por lo que todos los ejemplos anteriores se pueden simplificar para su lectura cambiando idx !== -1 ? x : y
a idx == -1 ? y : x
:
var value = ( ( value = someArray.indexOf(3) ) == -1 ? 0 : value );
if
y no anif/else