Ponto de interrogação e dois pontos em JavaScript

249

Me deparei com a seguinte linha

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

O que significam ?e :significam nesse contexto?

Inaimathi
fonte
Parece estar evitando definir a saturação para Infinity(causada pela divisão por zero).
Crescent Fresh

Respostas:

363

É chamado de Operador Condicional (que é um operador ternário ).

Tem a forma de condition:? value-if-true: value-if-false
Pense no ?como "então" e :como "outro".

Seu código é equivalente a

if (max != 0)
  hsb.s = 255 * delta / max;
else
  hsb.s = 0;
Greg
fonte
27
"?" não é o operador ternário; "?:" é o operador ternário. Falando sobre "?" como o operador ternário é como falar de Abbott sem Costello, Laurel sem Hardy, Cheech sem Chong ....
Jason S
11
Ok, ok ... agora estou usando um pronome ambíguo, feliz? :)
Greg
14
Para ser pedante, é um operador ternário, que por acaso é o único na maioria das linguagens de programação. Qualquer operador que trabalhe em 3 partes é um operador ternário, assim como additionum operador binário que opera nas expressões anteriores e seguintes (por exemplo, 1 + 2, o plus opera em 1 e 2), ou a negação é um operador unário (por exemplo, -x onde o valor de x é negado).
precisa saber é o seguinte
6
@ Davy8: E este pode ser chamado de operador condicional para ser específico.
Caracol mecânico
E se você quisesse verificar duas condições?
Thanos Dodd
38

Parênteses corretamente para maior clareza, é

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

significando retornar

  • 255*delta/max se max! = 0
  • 0 se max == 0
Jason S
fonte
7

Provavelmente, isso é um pouco mais claro quando escrito entre colchetes, da seguinte maneira:

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

O que ele faz é avaliar a peça nos primeiros colchetes. Se o resultado for verdadeiro, a parte após o? e antes do: é retornado. Se for falso, o que se segue é retornado.

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

?é um operador ternário. Funciona como um ifem conjunto com o:

!= significa não é igual

Portanto, a forma longa dessa linha seria

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

? : este não é o operador ternário?

var x= expression ? true:false

jldupont
fonte
3
Esse é um exemplo de uso, mas na verdade há uma versão mais curta da sua declaração, para os casos em que você deseja TRUE / FALSE: Se 'expression' fosse apenas uma variável com um número ou string, "var x = !! expressão "transformará em um resultado booleano.
Scott Lahteine ​​4/12/12
0

?: É uma condição de curto mão para else {}e if(){}problemas. Portanto, seu código é intercambiável com isso:

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

MDN - Operador condicional (ternário)

PIZZZZZZZZZZZA está aqui
fonte
-3

Tenha cuidado com isso. Um -1 é avaliado como verdadeiro, embora -1! = Verdadeiro e -1! = Falso. Confie em mim, eu já vi isso acontecer.

tão

-1? "lado verdadeiro": "lado falso"

avalia como "lado verdadeiro"

MEB
fonte
3
"No JavaScript, um valor truthy é um valor considerado verdadeiro quando avaliado em um contexto booleano. Todos os valores são truthy, a menos que sejam definidos como falsy (ou seja, exceto false, 0," ", null, undefined e NaN) . " É por isso que -1 é avaliado como verdadeiro. ( developer.mozilla.org/pt-BR/docs/Glossary/Truthy )
jobmo