Come si usa il? : operatore (condizionale) in JavaScript?


434

Qualcuno può spiegarmi in parole semplici qual è l' ?:operatore (condizionale, "ternario") e come usarlo?


2
Quelli sono operatori. Gli operandi sono i valori con cui usi questi operatori.
BoltClock

7
Curiosità: alcune lingue (vale a dire Groovy ) in realtà hanno un operando ?:(come l'hai scritto, senza alcuna dichiarazione tra) - l' operatore Elvis . Abbastanza intelligente.
Rob Hruska,

possibile duplicato di javascript se alternativo
Rob Hruska

3
I simboli su Google possono essere problematici, ma che ne dici di cercare su Google "operatori Javascript" (e impararli tutti)?
nnnnnn,

controlla questa voce della wiki en.wikipedia.org/wiki/Elvis_operator
Nerdroid

Risposte:


645

Questa è una scorciatoia di una riga per un'istruzione if-else. Si chiama operatore condizionale. 1

Ecco un esempio di codice che potrebbe essere abbreviato con l'operatore condizionale:

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

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

Questo può essere abbreviato in ?:modo simile:

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

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

Come tutte le espressioni, l'operatore condizionale può anche essere usato come un'istruzione indipendente con effetti collaterali, sebbene ciò sia insolito al di fuori della minificazione:

userIsYoungerThan21 ? serveGrapeJuice() : serveWine();

Possono anche essere incatenati:

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

Fai attenzione, o finirai con un codice contorto come questo:

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

1 Spesso chiamato "l'operatore ternario", ma in realtà è solo un operatore ternario [un operatore che accetta tre operandi]. Tuttavia, è l'unico che JavaScript ha attualmente.


56
Giusto per chiarire il nome: ternaryè il tipo di operatore (cioè ha 3 parti). Il nome di quello specifico operatore ternario è il conditional operator. Sembra esserci solo un operatore ternario in JS, quindi i termini vengono abusati.
Codice finito

1
@tryingToGetProgrammingLa forma ternaria dritta è tecnicamente un'espressione e le espressioni possono contenere altre espressioni per formare alberi di espressioni. quel codice proprio lì è come appare un albero delle espressioni :) vedi: fsharpforfunandprofit.com/posts/expressions-vs-statements
Alexander Troup

1
Consiglio vivamente di aggiornare l'esempio per il caso d'uso comune, non un caso d'uso con effetti collaterali spesso citato come abusage dell'operatore.
TJ Crowder,

7
Non so perché ci sia un po 'di grammatica nella parte inferiore, ma non è corretto. Se javascript ha solo 1 di un tipo di operatore, allora è sicuramente corretto dire l'operatore ternario e non un operatore ternario ... Dire "questo operatore ternario è un operatore ternario in javascript (ed è l'unico)" è sciocco, basta usare THE e implica tutto ciò.
Andrew,

1
@MarkCarpenterJr In JavaScript il modo tipico per farlo è con l' ||operatore, poiché cortocircuita se il valore a sinistra è vero.
Peter Olson,

142

Voglio aggiungerne alcune alle risposte fornite.

Nel caso in cui incontri (o desideri usare) un ternario in una situazione come 'visualizza una variabile se è impostata, altrimenti ...', puoi renderlo ancora più breve, senza un ternario .


Invece di:

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

Puoi usare:

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

Questo è Javascripts equivalente dell'operatore sternale stenografico di PHP ?:

O anche:

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

Valuta la variabile e, se è falsa o non impostata, passa alla successiva.


4
Stavo lottando con ternario e alla fine ho trovato questa risposta. Grazie!
Ljubisa Livac,

Se non dovessi usare le parentesi graffe intorno all'operatore ternario in 'Hello ' + (username ? username : 'guest') , Hello + se ignorato e viene restituito solo il risultato dell'operazione ternaria. Qualcuno può spiegare perché?
Shiva,

2
@Shiva Senza parentesi, valuta l' intera parte sinistra :, 'Hello ' + usernameche è sempre true, perché è una stringa con una lunghezza maggiore di 0.
Jeffrey Roosendaal,

26

Si chiama operatore "ternario" o "condizionale".

Esempio

L'operatore?: Può essere usato come scorciatoia per un'istruzione if ... else. In genere viene utilizzato come parte di un'espressione più ampia in cui un'istruzione if ... else sarebbe imbarazzante. Per esempio:

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

L'esempio crea una stringa contenente "Buona sera". se è dopo le 18:00. Il codice equivalente che utilizza un'istruzione if ... else dovrebbe apparire come segue:

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

Dalla documentazione MSDN JS .

Fondamentalmente è una frase condizionale abbreviata.

Vedi anche:


5
In realtà si chiama operatore condizionale.
ChaosPandion,

5
È un operatore condizionale ternario
Petah

4
@ Michael - Si prega di consultare la sezione 11.12 condizionale Operatore: (?) Del disciplinare: ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf
ChaosPandion

7
La gente sta ancora discutendo di queste cose? Accidenti.
BoltClock

7
@BoltClock - Non esattamente discutendo, semplicemente cercando di normalizzare il nostro vocabolario essenziale.
ChaosPandion

21

È un po 'difficile google quando tutto ciò che hai sono simboli;) I termini da usare sono "operatore condizionale javascript".

Se vedi altri simboli divertenti in Javascript, dovresti prima cercare gli operatori di Javascript: l'elenco degli operatori di MDC . L'unica eccezione che potresti incontrare è il $simbolo .

Per rispondere alla tua domanda, gli operatori condizionali sostituiscono semplici istruzioni if. Un esempio è il migliore:

var insurancePremium = age > 21 ? 100 : 200;

Invece di:

var insurancePremium;

if (age > 21) {
    insurancePremium = 100;
} else {
    insurancePremium = 200;
}

Buona spiegazione, ma l'esempio è scarso poiché assegna un valore booleano a seconda del risultato di un'espressione booleana, il che ha poco senso. Preferisci usare var olderThan20 = age > 20;invece.
BalusC

@BalusC - sì :) L'ho capito, ma gli esempi sono difficili da estrarre dal mio cappello! Penserà a uno migliore ...
David Tang,

9
z = (x == y ? 1 : 2);

è equivalente a

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

tranne, ovviamente, è più breve.


7

La maggior parte delle risposte sono corrette ma voglio aggiungere altro. L' operatore ternario è associativo a destra, il che significa che può essere incatenato nel modo seguente if … else-if … else-if … else:

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

Equivalente a:

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

Maggiori dettagli sono qui


1
Questo è quello che sto cercando.
Sazal Das

6

Si chiama operatore ternario

tmp = (foo==1 ? true : false);

6
Si chiama operatore condizionale. Capita di essere l'unico esempio di un operatore ternario nella lingua.
Razze di leggerezza in orbita

tmp = foo == 1 fa la stessa cosa, quindi sarebbe abbastanza
Robert Varga,

6

Operatore ternario

Comunemente abbiamo dichiarazioni condizionali in Javascript.

Esempio:

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

ma contiene due o più righe e non può essere assegnato a una variabile. Javascript ha una soluzione per questo Problema Operatore ternario . L'operatore ternario può scrivere su una riga e assegnarlo a una variabile.

Esempio:

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

Questo operatore ternario è simile nel linguaggio di programmazione C.


5

Ehi amico, ricordi solo che js funziona valutando vero o falso, giusto?

prendiamo un operatore ternario:

questionAnswered ? "Awesome!" : "damn" ;

In primo luogo, js verifica se questionAnswered è trueo false.

se true( ?) otterrai "Fantastico!"

else ( :) otterrai "dannazione";

Spero che questo aiuti amico :)


2

È if statementtutto su una riga.

Così

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

L'espressione da valutare si trova in ( )

Se corrisponde a true, eseguire il codice dopo il ?

Se corrisponde a false, eseguire il codice dopo il :


var x = 1; y = (x == 1)? vero falso;
augurone,

2
x = 9
y = 8

unario

++x
--x

Binario

z = x + y

Ternario

2>3 ? true : false;
2<3 ? true : false;
2<3 ? "2 is lesser than 3" : "2 is greater than 3";

1

Si chiama il ternary operator. Per qualche informazione in più, ecco un'altra domanda a cui ho risposto riguardo a questo:

Come scrivere un'istruzione IF else senza "else"


4
In realtà ternario è il tipo di operatore (cioè ha 3 parti). Il nome di quello specifico operatore ternario è il conditional operator. Sembra esserci solo un operatore ternario in JS, quindi i termini vengono abusati.
Codice finito

1

Questo probabilmente non è esattamente il modo più elegante per farlo. Ma per qualcuno che non ha familiarità con gli operatori ternari, questo potrebbe rivelarsi utile. La mia preferenza personale è quella di eseguire fallback di 1 linea anziché blocchi di condizioni.

  // 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);

Operatore ternario


1

Possiamo usare con Jquery e la lunghezza come nell'esempio seguente:

Supponiamo di avere la casella di testo GuarantorName che ha valore e vuole ottenere il nome e il cognome, potrebbe essere nullo. Così rathar di

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

Possiamo usare il codice seguente con Jquery con il codice minimo

    

    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>


1

Le espressioni ternarie sono molto utili in JS, in particolare React. Ecco una risposta semplificata a molti buoni, dettagliati forniti.

condition ? expressionIfTrue : expressionIfFalse

Pensa expressionIfTruea OG se l'istruzione diventa true;
pensare expressionIfFalsecome l'affermazione else.

Esempio:

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

questo ha verificato il valore di x, il primo y = (valore) restituito se vero, il secondo ritorno dopo i due punti: restituito y = (valore) se falso.


0

L'operatore condizionale (ternario) è l'unico operatore JavaScript che accetta tre operandi. Questo operatore viene spesso utilizzato come collegamento per l'istruzione if.

condition ? expr1 : expr2 

Se la condizione è vera, l'operatore restituisce il valore di expr1; in caso contrario, restituisce il valore di expr2.

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));

Per ulteriori chiarimenti si prega di leggere il link al documento MDN


0

Se hai una condizione controlla la funzione di istanza in javascript . è facile da usare operatore ternario . che avrà bisogno di una sola linea per implementare. Ex:

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

una funzione come questa con una condizione può essere scritta come segue.

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

condizione ? if True: if False


-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>"

puoi aggiungere html anche con l'operatore ternario
Chandrashekhar Komati

non è proprio così che dovresti scrivere un compito ternario e usare anche === not == altri saggi che potresti anche fare. sunday ?dovrebbe esseresun = "<span class='label " + ((sunday === 'True' ? 'label-success' : 'label-danger') + "'>S</span>"
TheRealMrCrowley

il punto centrale del ternario condizionale è abbreviare i valori di assegnazione condizionale, altrimenti dovresti semplicemente usare un'istruzione if
TheRealMrCrowley

ora dimmi che questo è corretto o no. se dici male allora continua a funzionare e sto usando il mio progetto ..
Chandrashekhar Komati

So che "funziona" come lo hai nel primo esempio, ma così fa quello che ti ho fornito che hai messo come seconda versione. Nota quante duplicazioni non necessarie ci sono nella versione principale rispetto a quella che ti ho dato. JS è il codice che viene inviato al browser, quindi la lunghezza del codice è importante
TheRealMrCrowley
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.