Point d'interrogation et deux points en JavaScript

249

Je suis tombé sur la ligne suivante

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

Que signifient ?et :signifient dans ce contexte?

Inaimathi
la source
Semble éviter de régler la saturation sur Infinity(causée par la division par zéro).
Crescent Fresh

Réponses:

363

Il est appelé l' opérateur conditionnel (qui est un opérateur ternaire ).

Il a la forme de condition:? value-if-true: value-if-false
Considérez le ?comme «alors» et :comme «autre».

Votre code est équivalent à

if (max != 0)
  hsb.s = 255 * delta / max;
else
  hsb.s = 0;
Greg
la source
27
"?" n'est pas l'opérateur ternaire; "?:" est l'opérateur ternaire. Parler de "?" comme l'opérateur ternaire, c'est comme parler d'Abbott sans Costello, de Laurel sans Hardy, de Cheech sans Chong ....
Jason S
11
Ok, ok ... maintenant j'utilise un pronom ambigu, heureux? :)
Greg
14
Pour être pédant, c'est un opérateur ternaire, qui se trouve être le seul dans la plupart des langages de programmation. Tout opérateur qui fonctionne sur 3 parties est un opérateur ternaire, tout comme additionun opérateur binaire qui opère sur les expressions précédentes et suivantes (par exemple 1 + 2, le plus fonctionne sur 1 et 2), ou la négation est un opérateur unaire (par exemple -x où la valeur de x est annulée).
Davy8
6
@ Davy8: Et celui-ci peut être appelé l' opérateur conditionnel pour être spécifique.
Escargot mécanique
Et si vous vouliez vérifier deux conditions?
Thanos Dodd
38

Bien entre parenthèses pour plus de clarté, il est

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

ce qui signifie retourner soit

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

Ceci est probablement un peu plus clair lorsqu'il est écrit avec des crochets comme suit:

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

Ce qu'il fait, c'est évaluer la pièce dans les premières parenthèses. Si le résultat est vrai, la partie après le? et avant le: est retourné. S'il est faux, ce qui suit le: est retourné.

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

?est un opérateur ternaire. Cela fonctionne comme un ifen conjonction avec le:

!= signifie pas égal

Ainsi, la forme longue de cette ligne serait

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

? : n'est-ce pas l'opérateur ternaire?

var x= expression ? true:false

jldupont
la source
3
C'est un exemple de son utilisation, mais il y a en fait une version plus courte de votre instruction, pour les cas où vous voulez juste TRUE / FALSE: Si 'expression' était juste une variable avec un nombre ou une chaîne, "var x = !! expression "en fera un résultat booléen.
Scott Lahteine
0

?: est une condition à court terme else {}et des if(){}problèmes. Votre code est donc interchangeable avec ceci:

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

MDN - Opérateur conditionnel (ternaire)

PIZZZZZZZZZZZA est ici
la source
-3

Soyez prudent avec cela. Un -1 est évalué comme vrai bien que -1! = Vrai et -1! = Faux. Croyez-moi, je l'ai vu arriver.

alors

-1 ? "vrai côté": "faux côté"

évalue le "vrai côté"

MEB
la source
3
"En JavaScript, une valeur véridique est une valeur qui est considérée comme vraie lorsqu'elle est évaluée dans un contexte booléen. Toutes les valeurs sont véridiques, sauf si elles sont définies comme fausses (c'est-à-dire, à l'exception de false, 0," ", null, undefined et NaN) . " C'est pourquoi -1 est évalué comme vrai. ( developer.mozilla.org/en-US/docs/Glossary/Truthy )
jobmo