Ternärer Javascript-Kurzschriftoperator

102

Ich weiß, dass in PHP 5.3 anstelle dieser redundanten ternären Operatorsyntax:

startingNum = startingNum ? startingNum : 1

... können wir gegebenenfalls eine Kurzsyntax für unsere ternären Operatoren verwenden:

startingNum = startingNum ?: 1

Und ich kenne den ternären Operator in Javascript:

startingNum = startingNum ? startingNum : 1

... aber gibt es eine Abkürzung?

Webdesigner
quelle

Antworten:

175
var startingNumber = startingNumber || 1;

So etwas wie das, wonach Sie suchen, wo es standardmäßig ist, wenn es nicht definiert ist?

var foo = bar || 1; // 1
var bar = 2;
foo = bar || 1;     // 2

Dies funktioniert übrigens für viele Szenarien, einschließlich Objekte:

var foo = bar || {}; // secure an object is assigned when bar is absent
Brad Christie
quelle
In der Tat, heute Morgen hüpfen. Behoben, aber danke fürs bemerken.
Brad Christie
1
Meinst du nicht ||statt ???
Rocket Hazmat
2
Vielen Dank! Du hast den Nagel auf den Kopf getroffen. In diesem Fall verwende ich tatsächlich ein Objekt. :)
Web_Designer
8
Für alle Neugierigen funktioniert dies, weil der ||Operator von JS nicht wahr oder falsch zurückgibt, sondern den ersten 'wahrheitsgemäßen' Wert zurückgibt. Angenommen , Sie haben val0und val1wie undefined, und val2ist 2, val3ist 3. val0 || val1 || val2 || val3wird zurückkehren 2, da es der erste "wahrheitsgemäße" Wert ist.
Jake T.
2
Ist diese Redewendung nicht ein Anti-Muster? Was passiert, wenn Sie 0 oder eine leere Zeichenfolge übergeben? Der Ausdruck 'ODER' überspringt diese und verwendet den Standardwert, bei dem Sie tatsächlich 0 oder eine leere Zeichenfolge wollten.
Paul Trzyna
24

|| gibt den ersten wahrheitsgemäßen Wert zurück, auf den es stößt, und kann daher ähnlich wie bei C # als Koaleszenzoperator verwendet werden ??

startingNum = startingNum || 1;
Adam Rackis
quelle
Ich mag Ihre Erklärung mehr als die anderen
ajax333221
12

Ja da ist:

var startingNum = startingNum || 1;

Funktioniert im Allgemeinen expr1 || expr2folgendermaßen (wie in der Dokumentation erwähnt ):

Gibt zurück, expr1wenn es konvertiert werden kann true; Andernfalls wird zurückgegeben expr2. Somit wird , wenn verwendet mit BooleanWerten ||zurückkehrt , truewenn einer der Operanden ist true; Wenn beides der Fall ist false, wird zurückgegeben false.

Tadeck
quelle
Ist es nicht korrekter, if a is truthyvs. zu sagen if a is evaluated to true?
JaredPar
3
@JaredPar: Um Unklarheiten zu vermeiden, habe ich meine ursprüngliche ausführliche Erklärung durch die von Mozilla Developer Network ersetzt. Es sollte weniger mehrdeutig sein.
Tadeck
2
var startingNum = startingNum || 1;

In diesem Fall können Sie den Operator OR verwenden.

Daniel
quelle
2
startingNum = startingNum || 1

Wenn Sie eine Bedingung mit null haben, wie

startingNum = startingNum ? startingNum : null

Sie können '&&' verwenden

startingNum = startingNum && startingNum
a2441918
quelle
Aber wird nicht anything && nullauf null ausgewertet, es anythingsei denn, es ist falsch?
Petruza
Ja, wenn etwas wahr ist, wird es mit null bewertet. Wenn es falsch ist, ergibt sich der falsche Wert
a2441918
1

Die obigen Antworten sind richtig. In JavaScript die folgende Anweisung:

startingNum = startingNum ? otherNum : 1

kann ausgedrückt werden als

startingNum = otherNum || 1

Ein anderes Szenario, das hier nicht behandelt wird, ist, wenn der Wert false zurückgeben soll, wenn er nicht übereinstimmt. Die JavaScript-Abkürzung hierfür lautet:

startingNum = startingNum ? otherNum : 0

Aber es kann ausgedrückt werden als

startingNum = startingNum && otherNum

Ich wollte nur ein anderes Szenario behandeln, falls andere nach einer allgemeineren Antwort suchen.

John Pace
quelle
Gibt es eine Abkürzung für so etwas: x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24???
Oldboy
@Anthony Nein, weil innerWidth * 0.0375 > 24unterscheidet sich von dem if trueTeil, der ist innerWidth * 0.0375. Die Kurzschrift kann nur verwendet werden, wenn expression to be evaluatedund if trueder gleiche Wert sind. Das Gleiche gilt, warum Sie keine Kurzschrift verwenden könnten x = someBoolean ? 'Heck yea!' : 'No way!'.
Deedub
@deedub Nun, eigentlich gibt es eine "Kurzschrift" (wenn Sie es so nennen würden), die wäreMath.max(innerWidth * 0.0375, 24)
oldboy
@Anthony Du würdest es nicht so nennen;) Funktioniert aber Math.maxin deinem Anwendungsfall besser als ein ternärer Operator.
Deedub
1
" startingNum = startingNum ? otherNum : 1kann ausgedrückt werden als startingNum = otherNum || 1" ist falsch. Ich habe das gerade getestet
Oldboy
0

Um ein ternäres wie zu machen:

boolean_condition ? true_result : false_result

In Javascript können Sie Folgendes tun:

(boolean_condition && true_result ) || false_result;

Beispiel:

(true && 'green') || 'red';
=> "green"
(false && 'green') || 'red';
=> "red"
xxjjnn
quelle
sooo x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24würde werden (innerWidth * 0.0375 > 24 && innerWidth * 0.0375) || 24?? Gibt es eine Abkürzung, damit ich sie nicht wiederholen muss innerWidth * 0.0375, außer sie einer Variablen zuzuweisen?
Oldboy
1
In diesem Fall Math.max( innerWidth * 0.0375 , 24 )würde elegant arbeiten. Für einen allgemeineren Fall wäre es gut, eine beschreibende Methode mit dem Namen "SomethingifiedInnerWidth" zu erstellen, die die Lesbarkeit verbessert, anstatt eine Variable zu erstellen. Obwohl es in einigen Fällen besser lesbar wäre, eine Variable (mit diesem beschreibenden Namen) zu haben, stellt sich in Zukunft die Frage, warum sie damit multipliziert wird. wird nicht angehoben.
xxjjnn
wow wusste nicht einmal, dass du ein zweites Argument dafür liefern könntest Math.max. super elegante Lösung !!
Oldboy