Jak korzystasz z? : (warunkowy) operator w JavaScript?

434

Czy ktoś może mi wyjaśnić prostymi słowami, czym jest ?:operator (warunkowy, „trójskładnikowy”) i jak go używać?

bez muudu
źródło
2
To są operatorzy. Operandy to wartości, z którymi korzystasz z tych operatorów.
BoltClock
7
Ciekawostka: niektóre języki (a mianowicie Groovy ) mają operand ?:(tak jak go napisałeś, bez instrukcji pomiędzy) - operator Elvisa . Całkiem sprytne.
Rob Hruska
możliwy duplikat javascript, jeśli alternatywa
Rob Hruska
3
Symbole Google mogą być problematyczne, ale co powiesz na „operatorów JavaScript” (i nauczenie się ich wszystkich)?
nnnnnn
sprawdź ten wpis wiki pl.wikipedia.org/wiki/Elvis_operator
Nerdroid

Odpowiedzi:

645

Jest to jednowierszowy skrót dla instrukcji if-else. To się nazywa operator warunkowy. 1

Oto przykład kodu, który można skrócić za pomocą operatora warunkowego:

var userType;
if (userIsYoungerThan18) {
  userType = "Minor";
} else {
  userType = "Adult";
}

if (userIsYoungerThan21) {
  serveDrink("Grape Juice");
} else {
  serveDrink("Wine");
}

Można to skrócić w ?:podobny sposób:

var userType = userIsYoungerThan18 ? "Minor" : "Adult";

serveDrink(userIsYoungerThan21 ? "Grape Juice" : "Wine");

Podobnie jak wszystkie wyrażenia, operator warunkowy może być również używany jako samodzielna instrukcja z efektami ubocznymi, chociaż jest to niezwykłe poza minimalizacją:

userIsYoungerThan21 ? serveGrapeJuice() : serveWine();

Mogą być nawet powiązane:

serveDrink(userIsYoungerThan4 ? 'Milk' : userIsYoungerThan21 ? 'Grape Juice' : 'Wine');

Bądź jednak ostrożny, bo skończysz z zawiłym kodem:

var k = a ? (b ? (c ? d : e) : (d ? e : f)) : f ? (g ? h : i) : j;

1 Często nazywany „operator trójargumentowy”, ale w rzeczywistości jest to tylko operator trójargumentowy [operator przyjmując trzy argumenty]. Jednak obecnie jest to jedyny JavaScript.

Peter Olson
źródło
56
Tylko dla wyjaśnienia nazwy: ternaryjest typem operatora (tzn. Składa się z 3 części). Nazwa tego konkretnego trójskładnikowego operatora to conditional operator. Zdarza się, że w JS jest tylko jeden operator trójskładnikowy, więc warunki są niewłaściwie używane.
Gone Coding
1
@tryingToGetProgrammingStraight forma trójskładnikowa jest technicznie wyrażeniem, a wyrażenia mogą zawierać inne wyrażenia tworzące drzewa wyrażeń. ten kod jest dokładnie tak, jak wygląda drzewo wyrażeń :) patrz: fsharpforfunandprofit.com/posts/expressions-vs-statements
Alexander Troup
1
Zdecydowanie zalecam aktualizację przykładu dla powszechnego przypadku użycia, a nie przypadku użycia ubocznego, często cytowanego jako nadużycie przez operatora.
TJ Crowder,
7
Nie jestem pewien, dlaczego na dole jest mały napis gramatyczny, ale jest on niepoprawny. Jeśli javascript ma tylko 1 operator typu, to zdecydowanie słuszne jest powiedzenie, że operator potrójny, a nie operator potrójny ... Mówiąc „ten operator potrójny jest operatorem potrójnym w javascript (i jest to jedyny)”: głupie, po prostu użyj THE i implikuje to wszystko.
Andrew
1
@MarkCarpenterJr W JavaScript typowym sposobem na to jest ||operator, ponieważ powoduje zwarcie, jeśli wartość po lewej jest prawdziwa.
Peter Olson,
142

Chcę dodać trochę do podanych odpowiedzi.

Jeśli napotkasz (lub chcesz użyć) trójkę w sytuacji takiej jak „wyświetl zmienną, jeśli jest ustawiona, w przeciwnym razie ...”, możesz ją skrócić, bez trójki .


Zamiast:

var welcomeMessage  = 'Hello ' + (username ? username : 'guest');

Możesz użyć:

var welcomeMessage  = 'Hello ' + (username || 'guest');

Jest to Javascripts równorzędny z trójskładnikowym operatorem PHP ?:

Lub nawet:

var welcomeMessage  = 'Hello ' + (username || something || maybethis || 'guest');

Ocenia zmienną, a jeśli jest fałszywa lub nieuzbrojona, przechodzi do następnej.

Jeffrey Roosendaal
źródło
4
Walczyłem z trójkami i ostatecznie znalazłem tę odpowiedź. Dziękuję Ci!
Ljubisa Livac
Gdybym nie używał nawiasów klamrowych wokół operatora potrójnego w 'Hello ' + (username ? username : 'guest'), Hello + jeśli zostanie zignorowany i zwrócony zostanie wynik operacji potrójnej. Czy ktoś może wyjaśnić, dlaczego?
Shiva
2
@Shiva Bez nawiasów kwadratowych ewaluuje całą lewą część: 'Hello ' + usernamezawsze true, ponieważ jest to struna o długości większej niż 0.
Jeffrey Roosendaal
26

Nazywa się to operatorem „trójskładnikowym” lub „warunkowym”.

Przykład

Operator?: Może być używany jako skrót do instrukcji if ... else. Zwykle jest używany jako część większego wyrażenia, w którym instrukcja if ... else byłaby niezręczna. Na przykład:

var now = new Date();
var greeting = "Good" + ((now.getHours() > 17) ? " evening." : " day.");

Przykład tworzy ciąg zawierający „Dobry wieczór”. jeśli jest po 18:00. Odpowiednik kodu przy użyciu instrukcji if ... else wyglądałby następująco:

var now = new Date();
var greeting = "Good";
if (now.getHours() > 17)
   greeting += " evening.";
else
   greeting += " day.";

Z dokumentacji MSDN JS .

Zasadniczo jest to skrót warunkowy.

Zobacz także:

Michael Robinson
źródło
5
W rzeczywistości nazywa się to operatorem warunkowym.
ChaosPandion,
5
Jest to trójskładnikowy operator warunkowy
Petah
4
@ Michael - patrz sekcja 11.12 Operator warunkowy (? :)
ChaosPandion
7
Czy ludzie wciąż się kłócą? Rany.
BoltClock
7
@BoltClock - Niezupełnie się kłóci, po prostu próbuje znormalizować nasze podstawowe słownictwo.
ChaosPandion,
21

Google jest trochę trudny, gdy wszystko, co masz, to symbole;) Używanymi terminami są „operator warunkowy javascript”.

Jeśli zobaczysz więcej śmiesznych symboli w Javascripcie, powinieneś najpierw poszukać operatorów JavaScript: listy operatorów MDC . Jedynym wyjątkiem, na który możesz się natknąć, jest $symbol .

Aby odpowiedzieć na twoje pytanie, operatory warunkowe zastępują proste instrukcje if. Przykład jest najlepszy:

var insurancePremium = age > 21 ? 100 : 200;

Zamiast:

var insurancePremium;

if (age > 21) {
    insurancePremium = 100;
} else {
    insurancePremium = 200;
}
David Tang
źródło
Dobre wyjaśnienie, ale przykład jest słaby, ponieważ przypisuje wartość boolowską w zależności od wyniku wyrażenia boolowskiego, co nie ma sensu. Wolisz zamiast var olderThan20 = age > 20;tego użyć .
BalusC
@BalusC - tak :) Zdałem sobie z tego sprawę, ale przykłady trudno wyciągnąć z mojego kapelusza! Pomyślę o lepszym ...
David Tang
9
z = (x == y ? 1 : 2);

jest równa

if (x == y)
    z = 1;
else
    z = 2;

z wyjątkiem, oczywiście, że jest krótszy.

Ernest Friedman-Hill
źródło
7

Większość odpowiedzi jest poprawna, ale chcę dodać trochę więcej. Operatora trójskładnikowego jest prawostronne, co oznacza, że może być łańcuch , w następujący sposób if … else-if … else-if … else:

function example() {
    return condition1 ? value1
         : condition2 ? value2
         : condition3 ? value3
         : value4;
}

Równoważny:

function example() {
    if (condition1) { return value1; }
    else if (condition2) { return value2; }
    else if (condition3) { return value3; }
    else { return value4; }
}

Więcej szczegółów tutaj

Arif
źródło
1
Właśnie tego szukam.
Sazal Das,
6

Nazywa się to operatorem trójskładnikowym

tmp = (foo==1 ? true : false);
orzeł 12
źródło
6
Nazywa się to operatorem warunkowym. Zdarza się, że jest jedynym przykładem jest potrójnego operatora w języku.
Wyścigi lekkości na orbicie
tmp = foo == 1 robi to samo, więc wystarczy
Robert Varga
6

Operator trójskładnikowy

Zwykle mamy w języku JavaScript instrukcje warunkowe.

Przykład:

if (true) {
    console.log(1)
} 
else {
    console.log(0)
}
# Answer
# 1

ale zawiera dwa lub więcej wierszy i nie można go przypisać do zmiennej. Javascript ma rozwiązanie dla tego Problemowego operatora trójskładnikowego . Operator trójskładnikowy może pisać w jednym wierszu i przypisywać do zmiennej.

Przykład:

var operator = true ? 1 : 0
console.log(operator)
# Answer
# 1

Ten trójskładnikowy operator jest podobny w języku programowania C.

Simplans
źródło
5

Hej kolego, pamiętaj tylko, że js działa, oceniając na prawdę lub fałsz, prawda?

weźmy trójkowego operatora:

questionAnswered ? "Awesome!" : "damn" ;

Po pierwsze, js sprawdza, czy pytanie Odpowiedź brzmi trueczy false.

if true( ?) dostaniesz „Awesome!”

else ( :) dostaniesz „cholera”;

Mam nadzieję, że to pomaga przyjacielowi :)

Guy Keren
źródło
2

To if statementwszystko na jednej linii.

Więc

var x=1;
(x == 1) ? y="true" : y="false";
alert(y);

Wyrażenie do oceny znajduje się w ( )

Jeśli jest zgodny z prawdą, wykonaj kod po ?

Jeśli pasuje do fałszu, wykonaj kod po :

Jason Gennaro
źródło
var x = 1; y = (x == 1)? prawda fałsz;
sierpień
2
x = 9
y = 8

unary

++x
--x

Dwójkowy

z = x + y

Potrójny

2>3 ? true : false;
2<3 ? true : false;
2<3 ? "2 is lesser than 3" : "2 is greater than 3";
Gajendra D Ambi
źródło
1

To się nazywa ternary operator. Aby uzyskać więcej informacji, oto inne pytanie, na które odpowiedziałem w tej sprawie:

Jak napisać instrukcję IF else bez „else”

Travis Webb
źródło
4
W rzeczywistości trójskładnikowy jest typem operatora (tzn. Składa się z 3 części). Nazwa tego konkretnego trójskładnikowego operatora to conditional operator. Zdarza się, że w JS jest tylko jeden operator trójskładnikowy, więc warunki są niewłaściwie używane.
Gone Coding
1

To prawdopodobnie nie jest najbardziej elegancki sposób na zrobienie tego. Ale dla kogoś, kto nie zna operatorów trójskładnikowych, może się to okazać przydatne. Osobiście wolę robić rezerwy 1-liniowe zamiast bloków warunków.

  // var firstName = 'John'; // Undefined
  var lastName = 'Doe';

  // if lastName or firstName is undefined, false, null or empty => fallback to empty string
  lastName = lastName || '';
  firstName = firstName || '';

  var displayName = '';

  // if lastName (or firstName) is undefined, false, null or empty
  // displayName equals 'John' OR 'Doe'

  // if lastName and firstName are not empty
  // a space is inserted between the names
  displayName = (!lastName || !firstName) ? firstName + lastName : firstName + ' ' + lastName;


  // if display name is undefined, false, null or empty => fallback to 'Unnamed'
  displayName = displayName || 'Unnamed';

  console.log(displayName);

Operator trójskładnikowy

Joakim Sandqvist
źródło
1

Możemy użyć Jquery, a także długości, jak poniżej:

Załóżmy, że mamy pole tekstowe „Gwarant”, które ma wartość i chce uzyskać imię i nazwisko - może być puste. Więc rathar niż

        var gnamesplit = $("#txtGuarantorName").val().split(" ");
        var gLastName = "";
        var gFirstName = "";
        if(gnamesplit.length > 0 ){
           gLastName  = gnamesplit[0];        
        }
        if(gnamesplit.length > 1 ){
           gFirstName = gnamesplit[1];        
        }

Możemy użyć poniższego kodu z Jquery z minimalnym kodem

    

    var gnamesplit = $("#txtGuarantorName").val().split(" ");
    var gLastName = gnamesplit.length > 0  ? gnamesplit[0] : "";
    var gFirstName =  gnamesplit.length > 1  ? gnamesplit[1] : "";
    $("#txtLastName").val(gLastName);
    $("#txtFirstName").val(gFirstName);
    
    
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div >
  Guarantor Name: <input type="text" id="txtGuarantorName" value="ASP.NET Core"  /><br/>
  <br/>
  <br/>
  
  First Name: <input type="text" id="txtLastName" value="ASP.NET Core"  />
  Last Name: <input type="text" id="txtFirstName" value="ASP.NET Core"  />
</div>

Ajay2707
źródło
1

Wyrażenia trójskładnikowe są bardzo przydatne w JS, szczególnie React. Oto uproszczona odpowiedź na wiele dobrych, szczegółowych.

condition ? expressionIfTrue : expressionIfFalse

Pomyśl o expressionIfTrueOG, jeśli oświadczenie jest prawdziwe;
pomyśl o tym, expressionIfFalsejak o innym zdaniu.

Przykład:

var x = 1;
(x == 1) ? y=x : y=z;

to sprawdzało wartość x, pierwsze y = (wartość) zwracane, jeśli true, drugie zwracane po dwukropku: zwracane y = (wartość), jeśli false.

PBrook
źródło
0

Operator warunkowy (trójskładnikowy) jest jedynym operatorem JavaScript, który przyjmuje trzy operandy. Ten operator jest często używany jako skrót do instrukcji if.

condition ? expr1 : expr2 

Jeśli warunek jest spełniony, operator zwraca wartość wyraż1; w przeciwnym razie zwraca wartość wyraż2.

function fact(n) {
  if (n > 1) {
    return n * fact(n-1);
  } else {
    return 1;
  }
  // we can replace the above code in a single line of code as below
  //return (n != 1) ? n * fact(n - 1) : 1;
}
console.log(fact(5));

Aby uzyskać więcej wyjaśnień, przeczytaj link do dokumentu MDN

Srikrushna
źródło
0

Jeśli masz jedną funkcję sprawdzania wystąpienia warunku w javascript . jest łatwy w obsłudze operator trójskładnikowy . który będzie wymagał tylko jednej linii do wdrożenia. Dawny:

    private module : string ='';
    private page:boolean = false;
    async mounted(){
     if(this.module=== 'Main')
    {
    this.page = true;}
    else{
    this.page = false;
    }
}

taką funkcję z jednym warunkiem można zapisać w następujący sposób.

this.page = this.module=== 'Main' ?true:false;

stan: schorzenie ? jeśli prawda: jeśli fałsz

Sunali Bandara
źródło
-3
 (sunday == 'True') ? sun="<span class='label label-success'>S</span>" : sun="<span class='label label-danger'>S</span>";

 sun = "<span class='label " + ((sunday === 'True' ? 'label-success' : 'label-danger') + "'>S</span>"
Chandrashekhar Komati
źródło
możesz dołączyć html również z operatorem trójskładnikowym
Chandrashekhar Komati
to naprawdę nie tak, jak należy napisać trójkowe zlecenie, a także użyć === not == inne mądre, które równie dobrze można po prostu zrobić. sunday ?powinno byćsun = "<span class='label " + ((sunday === 'True' ? 'label-success' : 'label-danger') + "'>S</span>"
TheRealMrCrowley
sednem warunkowej trójki
teraz powiedz mi, że to jest poprawne czy nie. jeśli źle powiesz, to nadal działa i korzystam z mojego projektu ..
Chandrashekhar Komati
Wiem, że „działa” tak, jak masz to w pierwszym przykładzie, ale tak samo dzieje się z tym, co podałem jako drugą wersję. Zauważ, ile niepotrzebnego powielania jest w najwyższej wersji w porównaniu do tej, którą ci dałem. JS to kod wysyłany do przeglądarki, więc długość kodu ma znaczenie
TheRealMrCrowley