Operador ternario taquigráfico de JavaScript

102

Sé que en php 5.3 en lugar de usar esta sintaxis de operador ternario redundante:

startingNum = startingNum ? startingNum : 1

... podemos usar una sintaxis abreviada para nuestros operadores ternarios cuando corresponda:

startingNum = startingNum ?: 1

Y sé sobre el operador ternario en javascript:

startingNum = startingNum ? startingNum : 1

... pero ¿hay una taquigrafía?

Diseñador web
fuente

Respuestas:

175
var startingNumber = startingNumber || 1;

¿Algo como eso, lo que está buscando, donde está predeterminado si no está definido?

var foo = bar || 1; // 1
var bar = 2;
foo = bar || 1;     // 2

Por cierto, esto funciona para muchos escenarios, incluidos los objetos:

var foo = bar || {}; // secure an object is assigned when bar is absent
Brad Christie
fuente
De hecho, ha estado rebotando esta mañana. Fijo, pero gracias por notarlo.
Brad Christie
1
¿No te refieres en ||lugar de ???
Rocket Hazmat
2
¡Gracias! Lo lograste. De hecho, estoy usando un objeto en este caso. :)
Web_Designer
8
Para cualquiera que tenga curiosidad, esto funciona porque el ||operador de JS no devuelve verdadero o falso, devuelve el primer valor 'verdadero'. Di que tienes val0y val1como undefined, y val2es 2, val3es 3. val0 || val1 || val2 || val3volverá 2, ya que es el primer valor de "verdad".
Jake T.
2
¿No es este modismo un anti-patrón? ¿Qué pasa si pasa 0 o una cadena vacía, la expresión 'OR' la omitirá y usará el valor predeterminado donde realmente quería 0 o una cadena vacía?
Paul Trzyna
24

|| devolverá el primer valor veraz que encuentre y, por lo tanto, se puede usar como un operador de fusión, similar al de C # ??

startingNum = startingNum || 1;
Adam Rackis
fuente
Me gusta tu explicación más que las otras
ajax333221
12

Sí hay:

var startingNum = startingNum || 1;

En general, expr1 || expr2funciona de la siguiente manera (como se menciona en la documentación ):

Devuelve expr1si se puede convertir a true; de lo contrario, vuelve expr2. Por tanto, cuando se utiliza con Booleanvalores, ||devuelve truesi alguno de los operandos es true; si ambos lo son false, vuelve false.

Tadeck
fuente
¿No es más correcto decir if a is truthyvs. if a is evaluated to true?
JaredPar
3
@JaredPar: Para evitar ambigüedades, he reemplazado mi explicación detallada original por la de Mozilla Developer Network. Debería ser menos ambiguo.
Tadeck
2
var startingNum = startingNum || 1;

En este caso, puede utilizar el operador OR.

Daniel
fuente
2
startingNum = startingNum || 1

Si tiene una condición con nulo, como

startingNum = startingNum ? startingNum : null

puedes usar '&&'

startingNum = startingNum && startingNum
a2441918
fuente
¿Pero no se anything && nullevaluará como nulo a menos que anythingsea ​​falso?
Petruza
Sí, si algo es veraz, se evalúa como nulo. Si es falso, se evalúa como el valor
falso
1

Las respuestas anteriores son correctas. En JavaScript, la siguiente declaración:

startingNum = startingNum ? otherNum : 1

se puede expresar como

startingNum = otherNum || 1

Otro escenario no cubierto aquí es si desea que el valor devuelva falso cuando no coincida. La abreviatura de JavaScript para esto es:

startingNum = startingNum ? otherNum : 0

Pero se puede expresar como

startingNum = startingNum && otherNum

Solo quería cubrir otro escenario en caso de que otros estuvieran buscando una respuesta más generalizada.

John Pace
fuente
¿hay una abreviatura para algo como esto: x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24???
oldboy
@Anthony No, porque innerWidth * 0.0375 > 24difiere de la if trueparte que es innerWidth * 0.0375. La taquigrafía solo se puede utilizar si expression to be evaluatedy if trueson el mismo valor. Igual por qué no podría taquigrafía x = someBoolean ? 'Heck yea!' : 'No way!'.
deedub
@deedub bueno, en realidad, hay una "taquigrafía" (si lo llamarías así) que seríaMath.max(innerWidth * 0.0375, 24)
oldboy
@Anthony No lo llamaría así;) Pero Math.maxfunciona mejor que un operador ternario en su caso de uso.
deedub
1
" startingNum = startingNum ? otherNum : 1puede expresarse como startingNum = otherNum || 1" es incorrecto. acabo de probar esto
oldboy
0

Para hacer un ternario como:

boolean_condition ? true_result : false_result

en javascript, puede hacer:

(boolean_condition && true_result ) || false_result;

Ejemplo:

(true && 'green') || 'red';
=> "green"
(false && 'green') || 'red';
=> "red"
xxjjnn
fuente
taaaan x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24se convertiría en (innerWidth * 0.0375 > 24 && innerWidth * 0.0375) || 24?? ¿Existe una taquigrafía, para que no tenga que repetir innerWidth * 0.0375, aparte de asignarla a una variable?
oldboy
1
En este caso, Math.max( innerWidth * 0.0375 , 24 )funcionaría con elegancia. Para un caso más general, sería bueno crear un método descriptivo llamado, por ejemplo, 'somethingifiedInnerWidth' que mejora la legibilidad, en lugar de crear una variable. Aunque en algunos casos sería más legible tener una variable (de ese nombre descriptivo), en el futuro la pregunta '¿por qué se multiplica por esto?' no se eleva.
xxjjnn
wow ni siquiera sabía que podía proporcionar un segundo argumento para Math.max. solucion super elegante !!
oldboy