JavaScript einzeilige 'if'-Anweisung - beste Syntax, diese Alternative?

201

Es wurde klargestellt, dass der Verzicht auf geschweifte Klammern in einer einzeiligen ifAnweisung für die Wartbarkeit und Lesbarkeit nicht ideal ist , obwohl die Meinung dennoch der Meinung ist.

Aber was ist damit?

if (lemons) { document.write("foo gave me a bar"); }

Es ist noch komprimierter und wenn es erweitert wird, werden die geschweiften Klammern nicht vergessen. Gibt es offensichtliche Probleme, und wenn nicht, welche Überlegungen gibt es? Ich habe das Gefühl, dass es immer noch sehr gut lesbar ist, zumindest so viel wie ein ternärer Operator. Es scheint mir, dass ternäre Operatoren aufgrund der Lesbarkeit nicht so häufig vorgeschlagen werden, obwohl ich der Meinung bin, dass diese Schlussfolgerung nicht ganz so einstimmig ist.

Der böse Zwilling in mir möchte dies vorschlagen, obwohl die Syntax offensichtlich nicht dafür gedacht ist und wahrscheinlich nur eine schlechte Idee ist.

(syntax) ? document.write("My evil twin emerges"): "";
David Hobs
quelle
2
Wäre schön, wenn JavaScript Bedingungen für das Ende der Phrase unterstützt:document.write("My evil twin emerges") if lemons
Beau Smith
7
Ich denke, Sie denken vielleicht über die kurze if, else-Aussage nach. ( variable = (condition) ? true-value : false-value;.) Viel Glück.
Progo

Antworten:

328

Ich habe das Kurzschlussverhalten des &&Bedieners gesehen, mit dem dies erreicht wurde, obwohl es für Leute, die nicht daran gewöhnt sind, schwierig sein kann, es zu lesen oder es sogar als Anti-Muster zu bezeichnen:

lemons && document.write("foo gave me a bar");  

Persönlich verwende ich oft einzeilig ifohne Klammern, wie folgt :

if (lemons) document.write("foo gave me a bar");

Wenn ich weitere Anweisungen hinzufügen muss, setze ich die Anweisungen in die nächste Zeile und füge Klammern hinzu. Da meine IDE automatisch einrückt, sind die Einwände gegen die Wartbarkeit gegen diese Vorgehensweise umstritten.

Peter Olson
quelle
11
Letzteres gefällt mir. Vielen Dank für die Eingabe und eine weitere kreative Alternative zum ersten!
David Hobs
Sie sollten wissen, was Sie erwarten, da leere Zeichenfolge und 0 falsche Werte sind, wird die Ausführung der zweiten Anweisung fehlschlagen
Orlando
1
Natürlich können Sie dort genauso gut eine explizitere boolesche Aussage
einfügen
7
@ PeterOlson, warum sind die Einwände gegen die Wartbarkeit umstritten? Was ist, wenn ein anderer Entwickler Ihre IDE bei der Konfiguration nicht verwendet?
Agconti
2
Vielen Dank, dass Sie mutig genug sind, sich für einzeilige Aussagen ohne Klammern auszusprechen. Eines Tages werden unsere Kinder Ihnen danken.
Marc M.
135

Ich benutze es so:

(lemons) ? alert("please give me a lemonade") : alert("then give me a beer");
asael2
quelle
35
alert(lemons?"please give me a lemonade":"then give me a beer")
MrVaykadji
43

Sie können dieses Format verwenden, das üblicherweise in PHP verwendet wird:

(lemon) ? document.write("foo gave me a bar") : document.write("if condition is FALSE");
Makro
quelle
12
Sie brauchen keine Klammern an der lemon.
Leymannx
6
Kann eine bewährte Methode sein, um () um eine bedingte Anweisung einzuschließen - beseitigt jegliche Verwirrung hinsichtlich der Reihenfolge der Operationen usw. für andere Entwickler. Ich irre mich normalerweise, wenn ich es spezifiziere, außer wenn es für jemanden, der anständig qualifiziert ist, keine Möglichkeit gibt, verwirrt zu werden.
DJVs
1
document.write(lemon ? "foo gave me a bar" : "if condition is FALSE");:)
Joseph Goh
Ich mag die Klammern, da sie für mich einen booleschen Zwang bedeuten.
Daniel Sokolowski
18

Diese eine Zeile ist viel sauberer.

if(dog) alert('bark bark');

Ich bevorzuge das. hoffe es hilft jemandem

Shakee93
quelle
16

kann dies verwenden,

lemons ? alert("please give me a lemonade") : alert("then give me a beer");

Erklärung: Wenn lemonsvorhanden, dann gib mir einealert("please give me a lemonade") else alert("then give me a beer")

Mohideen bin Mohammed
quelle
Tolle Lösung.
Davidson Lima
1
lemons? alert("please give me a fancy beer with a lemon wedge in it"): alert(please give me a beer")FTFY
stib
15

// Ein weiteres einfaches Beispiel

 var a = 11;
 a == 10 ? alert("true") : alert("false");
user3413838
quelle
15
warum nicht einfach .. var a = 11; alert(a === 10);?
ManuKaracho
@ ManuKaracho Ich sehe dieses Problem sehr oft, wenn ich mit ternären Anweisungen arbeite. Ich verstehe, dass OP vielleicht nur versucht hat, ein einfaches zu schreiben, aber es ist weit verbreitet in dem Code, den ich bei der Arbeit gelesen habe.
Adam-Beck
alert(a === 10 ? "true" : "false")
Josh Wood
@JoshWood Die Warnung gibt auch Boolesche Werte aus, sodass Sie genau das tun können, was alert(a===10)Manu gesagt hat.
Keith
12

Wie viele Leute gesagt haben, wenn Sie nach einer tatsächlichen 1 Zeile suchen, wenn dann:

    if (Boolean_expression) do.something();

Ist bevorzugt. Wenn du jedoch ein if / else machen willst, dann ist ternary dein Freund (und auch super cool):

    (Boolean_expression) ? do.somethingForTrue() : do.somethingForFalse();

EBENFALLS:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

Ich habe jedoch ein sehr cooles Beispiel gesehen. Grüße an @ Peter-Oslson für &&

    (Boolean_expression) && do.something();

Schließlich ist es keine if-Anweisung, aber das Ausführen von Dingen in einer Schleife mit einer Map / Reduce oder Promise.resolve () macht auch Spaß. Ruft nach @brunettdan

Kemacal
quelle
7

Wie bereits erwähnt, können Sie Folgendes verwenden:

&& Stil

lemons && document.write("foo gave me a bar");  

oder

Stil ohne Klammern

if (lemons) document.write("foo gave me a bar");

Kurzschlussrückführung

Wenn Sie jedoch die einzeilige ifAnweisung verwenden möchten, um eine Funktion kurzzuschließen, müssen Sie die Version ohne Klammern wie folgt verwenden:

if (lemons) return "foo gave me a bar";

wie

lemons && return "foo gave me a bar"; // does not work!

wird dir eine geben SyntaxError: Unexpected keyword 'return'

Marc
quelle
Bei einleitenden Kurzschlüssen können wir 'return' weglassen und es sollte wie erwartet funktionieren. `` `Zitronen &&" foo gab mir eine Bar "; // funktioniert! `` `
siwalikm
@siwalikm könntest du das erklären? Dies ist für den Fall, dass Sie nicht zurückkehren möchten lemons(wenn es falsch ist) - Sie möchten nur "foo gab mir bar" zurückgeben, wenn lemonses wahr ist.
Marc
wenn (Zitronen) zurückkehren "foo hat mir eine Bar gegeben"; das ist falsch. Es gibt Ihnen "Uncaught SyntaxError: Illegal return Anweisung"
Fenec
@ Fenec würden Sie den Browser und die Version freigeben, die Ihnen diesen Fehler verursachen? Das hat vor fast 2 Jahren für mich funktioniert und funktioniert auch weiterhin für mich.
Marc
4

Ich habe viele Antworten mit vielen Stimmen gesehen, die die Verwendung des ternären Operators befürworten. Das ternäre ist großartig, wenn a) Sie eine alternative Option haben und b) Sie einen ziemlich einfachen Wert aus einer einfachen Bedingung zurückgeben. Aber...

Die ursprüngliche Frage hatte keine Alternative, und der ternäre Operator mit nur einem (echten) Zweig zwingt Sie, eine konfektionierte Antwort zurückzugeben.

lemons ? "foo gave me a bar" : "who knows what you'll get back"

Ich denke, die häufigste Variante ist lemons ? 'foo...' : '' , und wie Sie aus dem Lesen der unzähligen Artikel für jede Sprache über wahr, falsch, wahr, falsch, null, null, leer, leer (mit unserem ohne?) Wissen, treten Sie ein ein Minenfeld (wenn auch ein gut dokumentiertes Minenfeld)

Sobald ein Teil des Ternärs kompliziert wird, sind Sie mit einer expliziteren Form der Bedingung besser dran.

Ein langer Weg zu sagen, dass ich dafür stimme if (lemons) "foo".

Anita Graham
quelle
2

Dies kann auch mit einer einzelnen Zeile mit whileSchleifen erfolgen und ifso:

if (blah)
    doThis();

Es funktioniert auch mit whileSchleifen.

Noitidart
quelle
7
Dies wird nicht fusseln und wird nicht empfohlen
danwellman
9
Das OP bat auch um einen Einzeiler.
Aaron-Codierung
2

Beispiel in Pfeilfunktionen:

let somethingTrue = true
[1,2,3,4,5].map(i=>somethingTrue && i*2)

In Versprechungen:

Promise.resolve()
  .then(_=>checkTrueFalse && asyncFunc())
  .then(_=>{ .. })

Andernfalls:

if(somethingTrue) thenDo()

Wenn es nur eine einfache Bedingung ist, bevorzuge ich es, wenn (Wert) zu verwenden, wann immer dies möglich ist, weil das Wort if am Anfang der Anweisung mehr über das Geschehen aussagt als Klammern und Fragezeichen.

Brunettdan
quelle
1
**Old Method:**
if(x){
   add(x);
}
New Method:
x && add(x);

Sogar Zuweisungsoperationen können wir auch mit runden Klammern machen

exp.includes('regexp_replace') && (exp = exp.replace(/,/g, '@&'));
Sajith Mantharath
quelle
"Auch Operation zuweisen können wir auch mit runden Klammern machen". Das ist sehr interessant, ich wusste nicht, dass es möglich ist, Operationen innerhalb dieser einzeiligen Operationen zuzuweisen.
Sagits