527 Stimmen

Wie verwendet man den ? (bedingter) Operator in JavaScript?

Mit einfachen Worten, was ist die ?: (bedingter, "ternärer") Operator und wie kann ich ihn verwenden?

765voto

Peter Olson Punkte 130102

Dies ist eine einzeilige Kurzform für eine if-else-Anweisung. Man nennt ihn den Bedingungsoperator. 1

Hier ein Beispiel für einen Code, der mit dem Bedingungsoperator verkürzt werden kann:

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

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

Diese kann mit der Option ?: etwa so:

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

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

Wie alle Ausdrücke kann auch der Bedingungsoperator als eigenständige Anweisung mit Seiteneffekten verwendet werden, allerdings ist dies ungewöhnlich außerhalb der Minifizierung:

userIsYoungerThan21 ? serveGrapeJuice() : serveWine();

Sie können sogar angekettet werden:

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

Seien Sie jedoch vorsichtig, sonst erhalten Sie einen verworrenen Code wie diesen:

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

1 Oft als "ternärer Operator" bezeichnet, aber eigentlich ist es nur a ternärer Operator [ein Operator, der drei Operanden akzeptiert]. Es ist der einzige, den JavaScript derzeit hat, aber.

67 Stimmen

Nur um den Namen zu klären: ternary ist die Typ des Operators (d.h. er hat 3 Teile). Der Name des dieser spezifische ternäre Operator ist die conditional operator . Zufällig gibt es in JS nur einen ternären Operator, so dass die Begriffe falsch verwendet werden.

1 Stimmen

@tryingToGetProgrammingStraight ternäre Form ist technisch ein Ausdruck, und Ausdrücke können andere Ausdrücke enthalten, um Ausdrucksbäume zu bilden. dieser Code dort ist, wie ein Ausdrucksbaum aussieht :) sehen: fsharpforfunandprofit.com/posts/ausdrucke-vs-aussagen

2 Stimmen

Es wird dringend empfohlen, das Beispiel für den üblichen Anwendungsfall zu aktualisieren, nicht für einen Anwendungsfall mit Nebeneffekten, der häufig als Missbrauch des Operators genannt wird.

178voto

Jeffrey Roosendaal Punkte 6360

Ich möchte hinzufügen. einige zu den gegebenen Antworten.

Für den Fall, dass Sie eine ternäre Variable in einer Situation wie 'zeige eine Variable an, wenn sie gesetzt ist, sonst...' verwenden wollen, können Sie sie noch kürzer machen, ohne Ternär .


Anstelle von:

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

Sie können verwenden:

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

Dies ist das Javascripts-Äquivalent des ternären Operators von PHP ?:

Oder sogar:

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

Sie wertet die Variable aus, und wenn sie falsch oder nicht gesetzt ist, geht sie zur nächsten weiter.

7 Stimmen

Ich hatte mit der Ternärform zu kämpfen und fand schließlich diese Antwort. Ich danke Ihnen!

0 Stimmen

Wenn ich die geschweiften Klammern um den ternären Operator nicht verwenden würde in 'Hello ' + (username ? username : 'guest') , Hello + ignoriert wird und nur das Ergebnis der ternären Operation zurückgegeben wird. Kann jemand erklären, warum?

4 Stimmen

@Shiva Ohne die Klammern wertet es die ganz linker Teil: 'Hello ' + username die immer true weil es sich um eine Zeichenkette mit einer Länge größer als 0 handelt.

29voto

Michael Robinson Punkte 28495

Man nennt ihn den "ternären" oder "bedingten" Operator.

Beispiel

Der Operator ?: kann als Abkürzung für eine if...else-Anweisung verwendet werden. Er wird normalerweise als Teil eines größeren Ausdrucks verwendet, wo eine if...else Anweisung umständlich wäre. Für Beispiel:

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

Das Beispiel erzeugt eine Zeichenkette mit dem Inhalt "Guten Abend.", wenn es nach 18 Uhr ist. Der entsprechende Code mit einer einer if...else-Anweisung würde wie folgt aussehen wie folgt aussehen:

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

Von MSDN JS-Dokumentation .

Im Grunde handelt es sich um eine kurze bedingte Anweisung.

Siehe auch:

7 Stimmen

Man nennt ihn eigentlich den bedingten Operator.

1 Stimmen

@Michael - Das ist so, weil es so ist a ternären Operator, aber das ist nicht sein offizieller Name. Es ist denkbar, dass eine zukünftige Version von JavaScript einen neuen ternären Operator einführt.

6 Stimmen

Es ist ein ternärer bedingter Operator

26voto

David Tang Punkte 89390

Es ist ein bisschen schwierig zu googeln, wenn man nur Symbole hat ;) Die zu verwendenden Begriffe sind "JavaScript bedingter Operator".

Wenn Sie weitere lustige Symbole in JavaScript sehen, sollten Sie zuerst die Operatoren von JavaScript nachschlagen: Mozilla Developer Center's Liste der Betreiber . Die einzige Ausnahme, auf die Sie wahrscheinlich stoßen werden, ist die $ Symbol .

Um Ihre Frage zu beantworten, Bedingungsoperatoren einfache if-Anweisungen ersetzen. Am besten ist ein Beispiel:

var insurancePremium = age > 21 ? 100 : 200;

Anstelle von:

var insurancePremium;

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

0 Stimmen

Gute Erklärung, aber das Beispiel ist schlecht, da es einen booleschen Wert in Abhängigkeit vom Ergebnis eines booleschen Ausdrucks zuweist, was wenig Sinn macht. Sie würden lieber Folgendes verwenden var olderThan20 = age > 20; stattdessen.

0 Stimmen

@BalusC - ja :) Das war mir klar, aber es ist schwer, Beispiele aus dem Hut zu zaubern! Ich werde mir ein besseres ausdenken...

23voto

Arif Punkte 5226

Die meisten der Antworten sind richtig, aber ich möchte noch etwas hinzufügen. Die ternärer Operator ist rechts-assoziativ, d. h. es kann sein verkettet auf folgende Art und Weise if … else-if… else-if … else :

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

Äquivalent zu:

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

Weitere Einzelheiten sind aquí

0 Stimmen

Ich bin hier gelandet, weil ich mich frage, ob es ein Kompatibilitätsproblem bei der Verwendung des verketteten Formats gibt, das zu einem Nebeneffekt führen könnte, wie es bei verschachtelten ternären Operatoren der Fall war. Es scheint seit seiner Geburt vollständig unterstützt zu werden, ich weiß nicht, ob Sie irgendwelche zusätzlichen Informationen haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X