Znak zapytania i dwukropek w JavaScript

249

Natknąłem się na następującą linię

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

Co ?i co :oznacza w tym kontekście?

Inaimathi
źródło
Wygląda na to, że unika się ustawiania nasycenia na Infinity(spowodowane dzieleniem przez zero).
Crescent Fresh

Odpowiedzi:

363

Nazywa się to Operatorem Warunkowym (który jest operatorem potrójnym ).

Ma postać condition:? value-if-true: value-if-false
Pomyśl o tym ?jako „wtedy” i :jako „innym”.

Twój kod jest równoważny z

if (max != 0)
  hsb.s = 255 * delta / max;
else
  hsb.s = 0;
Greg
źródło
27
„?” nie jest operatorem trójskładnikowym; „?:” jest operatorem trójskładnikowym. Rozmawiać o "?" ponieważ operator trójskładnikowy mówi jak Abbott bez Costello, Laurel bez Hardy'ego, Cheech bez Chonga ...
Jason S
11
Ok, ok ... teraz używam niejednoznacznego zaimka, szczęśliwy? :)
Greg,
14
Mówiąc pedantycznie, jest to trójskładnikowy operator, który okazuje się być jedynym w większości języków programowania. Każdy operator działający na 3 częściach jest operatorem potrójnym, podobnie jak additionoperator binarny, który działa na poprzedzających i następujących wyrażeniach (np. 1 + 2 plus działa na 1 i 2), lub negacja jest operatorem jednoargumentowym (np. -X gdzie wartość x jest zanegowana).
Davy8
6
@ Davy8: A ten można nazwać operatorem warunkowym, aby być konkretnym.
Ślimak mechaniczny
Co jeśli chcesz sprawdzić dwa warunki?
Thanos Dodd
38

Właściwie jest nawiasowany dla jasności

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

co oznacza zwrot albo

  • 255*delta/max jeśli max! = 0
  • 0 jeśli max == 0
Jason S.
źródło
7

Jest to prawdopodobnie nieco jaśniejsze, gdy zapisuje się w nawiasach w następujący sposób:

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

Dokonuje oceny części w pierwszych nawiasach. Jeśli wynik jest prawdziwy, to część po? i zanim: zostanie zwrócony. Jeśli jest to fałsz, zwracane jest to, co następuje:.

Nikolas Stephan
źródło
7
hsb.s = max != 0 ? 255 * delta / max : 0;

?jest operatorem trójskładnikowym. Działa jak ifw połączeniu z:

!= znaczy nie równa się

Tak więc długa forma tej linii byłaby

if (max != 0) { //if max is not zero
  hsb.s = 255 * delta / max;
} else {
  hsb.s = 0;
}
CaffGeek
źródło
1

? : czy to nie jest trójskładnikowy operator?

var x= expression ? true:false

Jldupont
źródło
3
Jest to jeden z przykładów jego użycia, ale w rzeczywistości istnieje krótsza wersja twojego oświadczenia, dla tych przypadków, w których chcesz tylko PRAWDA / FAŁSZ: Jeśli „wyrażenie” było tylko jakąś zmienną z liczbą lub łańcuchem, „var x = !! wyrażenie ”zamieni go w wynik boolowski.
Scott Lahteine
0

?: jest warunkiem krótkiej ręki else {}i if(){}problemami. Twój kod jest więc wymienny:

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

MDN - operator warunkowy (trójskładnikowy)

PIZZZZZZZZZZZA jest tutaj
źródło
-3

Uważaj na to. A -1 ma wartość prawda, chociaż -1! = Prawda, a -1! = Fałsz. Zaufaj mi, widziałem, jak to się dzieje.

więc

-1? „true side”: „false side”

ocenia na „prawdziwą stronę”

MEB
źródło
3
„W JavaScript, wartość prawdy jest wartością, która jest uważana za prawdziwą, gdy jest oceniana w kontekście boolowskim. Wszystkie wartości są prawdziwe, chyba że są zdefiniowane jako fałsz (tj. Z wyjątkiem fałszu, 0,” ”, null, niezdefiniowana i NaN) . ” Dlatego -1 jest oceniane jako prawda. ( developer.mozilla.org/en-US/docs/Glossary/Truthy )
jobmo