Signo de interrogación y dos puntos en JavaScript

249

Me encontré con la siguiente línea

hsb.s = max != 0 ? 255 * delta / max : 0;

¿Qué significan ?y :en este contexto?

Inaimathi
fuente
Parece estar evitando establecer la saturación en Infinity(causada por la división por cero).
Crescent Fresh el

Respuestas:

363

Se llama operador condicional (que es un operador ternario ).

Tiene la forma de condition:? value-if-true: value-if-false
Piense en el ?como "entonces" y :como "más".

Tu código es equivalente a

if (max != 0)
  hsb.s = 255 * delta / max;
else
  hsb.s = 0;
Greg
fuente
27
"?" no es el operador ternario; "?:" es el operador ternario. Hablando sobre "?" como el operador ternario es como hablar de Abbott sin Costello, sin Laurel Hardy, Cheech y sin Chong ....
Jason S
11
Ok, ok ... ahora estoy usando un pronombre ambiguo, ¿feliz? :)
Greg
14
Para ser pedante, es un operador ternario, que resulta ser el único en la mayoría de los lenguajes de programación. Cualquier operador que trabaja en 3 partes es un operador ternario, al igual additionque un operador binario que opera en las expresiones anteriores y siguientes (por ejemplo, 1 + 2, el más opera en 1 y 2), o la negación es un operador unario (por ejemplo, -x donde se niega el valor de x).
Davy8
66
@ Davy8: Y este se puede llamar operador condicional para ser específico.
Caracol mecánico
¿Qué pasa si desea verificar dos condiciones?
Thanos Dodd
38

Bien entre paréntesis para mayor claridad, es

hsb.s = (max != 0) ? (255 * delta / max) : 0;

significado retorno tampoco

  • 255*delta/max si max! = 0
  • 0 si max == 0
Jason S
fuente
7

Esto es probablemente un poco más claro cuando se escribe entre paréntesis de la siguiente manera:

hsb.s = (max != 0) ? (255 * delta / max) : 0;

Lo que hace es evaluar la parte en los primeros corchetes. Si el resultado es verdadero, entonces la parte después de? y antes de que se devuelva: Si es falso, se devuelve lo que sigue a:

Nikolas Stephan
fuente
7
hsb.s = max != 0 ? 255 * delta / max : 0;

?Es un operador ternario. Funciona como un ifen conjunto con el:

!= significa no es igual

Entonces, la forma larga de esta línea sería

if (max != 0) { //if max is not zero
  hsb.s = 255 * delta / max;
} else {
  hsb.s = 0;
}
CaffGeek
fuente
1

? : ¿No es este el operador ternario?

var x= expression ? true:false

jldupont
fuente
3
Ese es un ejemplo de su uso, pero en realidad hay una versión más corta de su declaración, para aquellos casos en los que solo desea VERDADERO / FALSO: ¡Si 'expresión' era solo una variable con un número o cadena, "var x = !! expresión "lo convertirá en un resultado booleano.
Scott Lahteine
0

?: Es una condición taquigrafía para else {}y if(){}problemas. Entonces su código es intercambiable para esto:

if(max != 0){
       hsb.s = 225 * delta / max
}
else {
       hsb.s = 0
}

MDN - Operador condicional (ternario)

PIZZZZZZZZZZZA está aquí
fuente
-3

Ten cuidado con esto. A -1 se evalúa como verdadero aunque -1! = Verdadero y -1! = Falso. Confía en mí, lo he visto suceder.

entonces

-1? "lado verdadero": "lado falso"

se evalúa como "lado verdadero"

MEB
fuente
3
"En JavaScript, un valor verdadero es un valor que se considera verdadero cuando se evalúa en un contexto booleano. Todos los valores son verdaderos a menos que se definan como falsos (es decir, excepto falso, 0", "nulo, indefinido y NaN) ". Es por eso que -1 se evalúa como verdadero. ( developer.mozilla.org/en-US/docs/Glossary/Truthy )
jobmo