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?

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

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;

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.


¿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.


2
startingNum = startingNum || 1

Si tiene una condición con nulo, como

startingNum = startingNum ? startingNum : null

puedes usar '&&'

startingNum = startingNum && startingNum

¿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.


¿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"

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.