Weglassen des zweiten Ausdrucks bei Verwendung der Abkürzung if-else

290

Kann ich die if elseKurzschrift ohne die schreiben else?

var x=1;

x==2 ? dosomething() : doNothingButContinueCode();   

Ich habe bemerkt, nulldass das Putten für das andere funktioniert (aber ich habe keine Ahnung, warum oder ob das eine gute Idee ist).

Edit: Einige von euch scheinen amüsiert zu sein, warum ich das versuchen würde. Seien Sie versichert, es ist nur aus Neugier. Ich mag es, mit JavaScript herumzuspielen.

Nikki
quelle
Ich denke, es gibt eine var | varSyntax. Vorsicht, da es möglicherweise schwierig ist, "zu sehen", insbesondere (IMO) -Ternäre, die problematisch sind. Sparsam verwenden.
Jared Farrish
@JaredFarrish Ist es nicht der springende Punkt bei Ternären, dass sie leichter zu "sehen" sind als if-Anweisungen? Auch was ist diese Syntax, von der Sie sprechen, es sieht interessant aus.
Hassan
1
Nein, ich glaube nicht, dass sie in allen Fällen einfacher sind. Der "springende Punkt" in meinem Kopf ist, entweder alles in eine Zeile zu setzen ("meine Codes sind kürzer als Ihre") oder für bestimmte, wörtliche Fälle mit vereinfachenden Ergebnissen. Das Stapeln von Ternären ist besonders schädlich und sollte unter allen Umständen vermieden werden. :)
Jared Farrish
1
@ Hassan - Ich habe so etwas gesehen foo = bar | cat;, wo, wenn das erste falsch ist? null?, es "fällt durch" auf die Sekunde. Ich habe es jedoch nur gesehen und benutze es nicht.
Jared Farrish
3
@JaredFarrish: Das ist a || boder a && bwird sonst bimmer ausgewertet.
Kennytm

Antworten:

263

Dies ist auch eine Option:

x==2 && dosomething();

dosomething()wird nur aufgerufen, wenn x==2als wahr ausgewertet wird. Dies wird als Kurzschluss bezeichnet .

In solchen Fällen wird es nicht häufig verwendet, und Sie sollten Code wie diesen wirklich nicht schreiben. Ich ermutige diesen einfacheren Ansatz:

if(x==2) dosomething();

Sie sollten jederzeit lesbaren Code schreiben. Wenn Sie sich Sorgen über die Dateigröße machen, erstellen Sie einfach eine verkleinerte Version mit Hilfe eines der vielen JS-Kompressoren. (zB Googles Closure Compiler )

ajax333221
quelle
10
Oh, Kurzschluss, richtig. Die Lesbarkeit von Code wird meiner Meinung nach bei den meisten fortgeschrittenen Entwicklern und einigen "erfahrenen Profis" unterschätzt.
Jared Farrish
2
Technisch gesehen brauchen Sie die Klammern nicht: if (1 - 1 === 0) $('.woot').text('Woot!'); Ich benutze dieses Formular die ganze Zeit mit PHP, und jetzt, wo ich Coffeescript einnehme, verwende ich es auch in meinem Javascript.
Hollenbeck
5
Ich persönlich glaube, wenn es ein kleines Wenn mit einem Ergebnis ist, wenn es wahr ist. Es ist schneller und einfacher zu schreiben. X == 2 && dosomething ();
Dean Meehan
9
if x==2 && doSomething() || doSomethingElse()
August
1
Ich wünschte, JavaScript hätte diese Ruby-ähnliche Syntax enthalten : doSomething() if x === 2. Ich vermisse Ruby nicht, aber das vermisse ich.
Chad Johnson
743

Was Sie haben, ist eine ziemlich ungewöhnliche Verwendung des ternären Operators . Normalerweise wird es als Ausdruck und nicht als Anweisung innerhalb einer anderen Operation verwendet, z.

var y = (x == 2 ? "yes" : "no");

Aus Gründen der Lesbarkeit (weil das, was Sie tun, ungewöhnlich ist) und weil es das "Sonstige" vermeidet, das Sie nicht wollen, würde ich vorschlagen:

if (x==2) doSomething();
Nicole
quelle
Hier können wir eine Abschlusszeile hinzufügen, die als vollständiger Befehl eingefügt wurde (in meinem Beispiel verwenden Sie die Funktion zum Ein- und Ausblenden von jquery). X == 2? $ (Element) .fadeIn (): $ (Element) .fadeIn (); Es ist nicht zwingend erforderlich, eine Rückgabevariable zu haben (wie var y im ersten Code).
Prageeth Godage
1
Sie müssen dreifache "=" - Zeichen verwenden, damit die Logik perfekt ist. wie in var y = (x === 2? "yes": "no");
Fino
63

Andere Option:

x === 2 ? doSomething() : void 0;
Buzinas
quelle
3
Wenn jemand nicht weiß, warum er void 0 verwendet, empfehle ich, diesen Link zu
Carlinhos
20

Wenn Sie das andere nicht tun, warum nicht:

if (x==2) doSomething();
Prescott
quelle
4
Sie können es auch tun, wenn Sie das andere tun
nmirceac
14

Die Verwendung nullist für einen der Zweige eines ternären Ausdrucks in Ordnung. Und ein ternärer Ausdruck ist als Aussage in Javascript in Ordnung.

Wenn Sie jedoch eine Prozedur aufrufen möchten, ist es aus Gründen des Stils klarer, dies mit if..else zu schreiben:

if (x==2) doSomething;
else doSomethingElse

oder in Ihrem Fall

if (x==2) doSomething;
Ted Hopp
quelle
6

Winzige Ergänzung zu diesem sehr alten Thread ..

Wenn Sie einen Ausdruck in einer for/ while-Schleife mit einem ternären Operator auswerten und dies möchten continueoder möchten, breakhaben Sie ein Problem, da beide continue& breakkeine Ausdrücke sind , sondern Anweisungen ohne Wert.

Dies wird produzieren Uncaught SyntaxError: Unexpected token continue

 for (const item of myArray) {
      item.value ? break : continue;
 }

Wenn Sie wirklich einen Einzeiler möchten, der eine Anweisung zurückgibt, können Sie stattdessen Folgendes verwenden:

  for (const item of myArray) {
      if (item.value) break; else continue;
  }
  • PS - Dieser Code kann einige Augenbrauen hochziehen. Ich sage nur .. :)
DotBot
quelle
4

Technisch gesehen funktioniert es , dort null oder 0 oder nur einen zufälligen Wert zu setzen (da Sie den Rückgabewert nicht verwenden). Warum verwenden Sie dieses Konstrukt jedoch anstelle des ifKonstrukts? Es ist weniger offensichtlich, was Sie versuchen, wenn Sie Code auf diese Weise schreiben, da Sie möglicherweise Leute mit dem No-Op verwechseln (in Ihrem Fall null).

nhahtdh
quelle
2

Wahrscheinlich am kürzesten (basierend auf dem OP-Operator und seiner Priorität )

x-2||dosomething()

Kamil Kiełczewski
quelle