Fragezeichen und Doppelpunkt in JavaScript

249

Ich bin auf die folgende Zeile gestoßen

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

Was bedeutet das ?und :in diesem Zusammenhang?

Inaimathi
quelle
Es scheint zu vermeiden, die Sättigung auf Infinity(verursacht durch Teilen durch Null) zu setzen.
Crescent Fresh

Antworten:

363

Es wird als bedingter Operator (der ein ternärer Operator ist ) bezeichnet.

Es hat die Form von : condition? value-if-true: value-if-false
Stellen Sie sich das ?als "dann" und :als "sonst" vor.

Ihr Code entspricht

if (max != 0)
  hsb.s = 255 * delta / max;
else
  hsb.s = 0;
Greg
quelle
27
"?" ist nicht der ternäre Operator; "?:" ist der ternäre Operator. Sprechen über "?" als der ternäre Operator ist wie über Abbott ohne Costello, Laurel ohne Hardy, Cheech ohne Chong zu sprechen ....
Jason S
11
Ok, ok ... jetzt benutze ich ein mehrdeutiges Pronomen, glücklich? :)
Greg
14
Um pedantisch zu sein, ist es ein ternärer Operator, der in den meisten Programmiersprachen der einzige ist. Jeder Operator, der mit 3 Teilen arbeitet, ist ein ternärer Operator, genau wie additionein binärer Operator, der mit den vorhergehenden und folgenden Ausdrücken arbeitet (z. B. 1 + 2, das Plus mit 1 und 2), oder die Negation ist ein unärer Operator (z. B. -x) wobei der Wert von x negiert wird).
Davy8
6
@ Davy8: Und dieser kann als Bedingungsoperator bezeichnet werden , um genau zu sein.
Mechanische Schnecke
Was ist, wenn Sie zwei Bedingungen überprüfen möchten?
Thanos Dodd
38

Aus Gründen der Klarheit richtig in Klammern gesetzt, ist es

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

was bedeutet, entweder zurück

  • 255*delta/max wenn max! = 0
  • 0 wenn max == 0
Jason S.
quelle
7

Dies ist wahrscheinlich etwas klarer, wenn in Klammern wie folgt geschrieben wird:

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

Was es tut, ist das Teil in den ersten Klammern auszuwerten. Wenn das Ergebnis wahr ist, dann der Teil nach dem? und bevor das: zurückgegeben wird. Wenn es falsch ist, wird das Folgende zurückgegeben :.

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

?ist ein ternärer Operator. Es funktioniert wie ein ifin Verbindung mit dem:

!= bedeutet nicht gleich

Die lange Form dieser Linie wäre also

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

? : Ist das nicht der ternäre Operator?

var x= expression ? true:false

jldupont
quelle
3
Das ist ein Beispiel für seine Verwendung, aber es gibt tatsächlich eine kürzere Version Ihrer Anweisung für die Fälle, in denen Sie nur WAHR / FALSCH möchten: Wenn 'Ausdruck' nur eine Variable mit einer Zahl oder einem String darin war, ist "var x = !! Ausdruck "macht es zu einem booleschen Ergebnis.
Scott Lahteine
0

?: ist eine Kurzbedingung für else {}und if(){}Probleme. Ihr Code ist also austauschbar:

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

MDN - Bedingter (ternärer) Operator

PIZZZZZZZZZZA ist hier
quelle
-3

Sei vorsichtig damit. A -1 ergibt true, obwohl -1! = True und -1! = False. Vertrau mir, ich habe es gesehen.

so

-1? "wahre Seite": "falsche Seite"

bewertet zu "wahrer Seite"

MEB
quelle
3
"In JavaScript ist ein Wahrheitswert ein Wert, der als wahr angesehen wird, wenn er in einem booleschen Kontext ausgewertet wird. Alle Werte sind wahr, es sei denn, sie sind als falsch definiert (dh mit Ausnahme von falsch, 0, null, undefiniert und NaN). . " Aus diesem Grund wird -1 als wahr bewertet. ( developer.mozilla.org/en-US/docs/Glossary/Truthy )
Jobmo