2012-06-17 18 views
229

Kann ich die 'wenn sonst' Kurzschrift ohne das sonst schreiben?Javascript wenn sonst Kurzschrift

zB:

var x=1; 

x==2? dosomething:doNothingButContinueCode; 

Ich habe bemerkt, ‚null‘ für die anderen Werke setzen, aber ich habe keine Ahnung, warum oder ob das eine gute Idee ist.

EDIT: Einige von Ihnen scheinen verwirrt, warum ich es versuchen würde. Sei versichert, dass es nur aus Neugier ist. Ich mag es, mit js herumzualbern.

+0

Ich denke, es gibt eine 'var | var'syntax. Vorsichtig, da es möglicherweise schwierig ist zu "sehen", vor allem (IMO) ternärs sind problematisch. Verwenden Sie sparsam. –

+0

@JaredFarrish Ist nicht der ganze Sinn von ternären, dass sie leichter zu "sehen" sind als if-Anweisungen? Auch über welche Syntax du redest, es sieht interessant aus. – Hassan

+1

Nein, ich denke nicht, dass sie in allen Fällen einfacher sind. Der "springende Punkt" in meinem Kopf ist, entweder alles auf eine Zeile zu setzen ("Meine Codes kürzer als deins") oder für spezifische, wörtliche Fälle mit vereinfachenden Ergebnissen. Das Stapeln von Ternären ist besonders schädlich und sollte um jeden Preis vermieden werden. ':)' –

Antwort

209

Dies ist auch eine Option:

x == 2 && dosomething(); 

dosomething() nur, wenn x == 2 genannt wird. Dies wird Short-circuiting genannt.

Es wird nicht häufig in solchen Fällen verwendet, und Sie sollten Code wirklich nicht so schreiben. Ich ermutige diesen Ansatz stattdessen:

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 Tausenden von JS-Kompressoren. (Ich empfehle Google Closure Compiler)

+7

Oh, Kurzschluss, richtig . Codelesbarkeit ist unterschätzt, denke ich bei den meisten fortgeschrittenen Entwicklern und einigen "erfahrenen Profis". –

+2

Technisch brauchen Sie nicht die Klammern: 'if (1 - 1 === 0) $ ('. Woot'). Text ('Woot!');' Ich benutze diese Form die ganze Zeit mit PHP, und jetzt, wo ich Coffeescript anwende, benutze ich es auch in meinem Javascript. –

+4

Ich persönlich glaube, wenn es ein kleines wenn mit einem Ergebnis ist, wenn es wahr ist .. es schneller und einfacher zu schreiben x == 2 && dosomething(); –

15

Wenn Sie nicht das sonst tun, warum nicht tun:

if (x==2) doSomething(); 
+4

Sie können es tun, auch wenn Sie das sonst tun – nmirceac

10

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

Als eine Frage des Stils, obwohl, wenn Sie im Sinn den Aufruf einer Prozedur haben, ist es klarer zu schreiben mit if..else:

if (x==2) doSomething; 
else doSomethingElse 

oder in Ihrem Fall,

if (x==2) doSomething; 
3

Technisch gesehen funktioniert das Setzen von null oder 0 oder nur irgendein zufälliger Wert (da Sie den Rückgabewert nicht verwenden). Warum verwenden Sie dieses Konstrukt anstelle des if Konstrukts? Es ist weniger offensichtlich, was Sie zu tun versuchen, wenn Sie Code auf diese Weise schreiben, da Sie die Leute mit dem No-Op (in Ihrem Fall null) verwechseln können.

676

Was Sie haben, ist eine ziemlich ungewöhnliche Verwendung der ternary operator. Normalerweise wird es als Ausdruck verwendet wird, nicht eine Erklärung, innerhalb eines anderen Betriebes, zB:

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

Also, zur besseren Lesbarkeit (weil das, was Sie tun, ist ungewöhnlich), und weil es vermeidet die „else“, dass Sie wollen nicht, würde ich vorschlagen:

if (x==2) doSomething(); 
+0

In hier können wir Finishing-Zeile als einen vollständigen Befehl eingefügt (als mein Beispiel verwenden jquery Ein- und Ausblenden Funktion) x == 2? $ (Element) .fadeIn(): $ (Element) .fadeIn(); Es ist nicht zwingend erforderlich, eine Rückgabevariable zu haben (wie Var im ersten Code). – Prageeth

+1

müssen Sie dreifache Zeichen "=" verwenden, damit die Logik perfekt ist. wie in var y = (x === 2? "ja": "nein"); – fino

+2

@fino Das ist technisch richtig, aber wenn es verwendet wird, wenn es nicht unbedingt notwendig ist, verursacht '=== oft mehr Probleme als es löst. Zum Beispiel, würdest du wirklich wollen, dass "2" übereinstimmt, aber nicht "2"? JavaScript (und ähnliche Sprachen) machen es einfach, sich nicht darum zu kümmern, welches was ist; Zum Beispiel wird die Benutzereingabe von einem Textfeld eine Zeichenkette sein und kann mit einer Zahl 2 mit '==' ohne Umwandlung verglichen werden. '===' würde dort ein Problem verursachen. – Nicole

48

Eine weitere Option:

x === 2 ? doSomething() : void 0; 
+2

Wenn jemand nicht weiß warum verwenden Sie void 0 Ich schlage vor, lesen Sie diese [link] (https://stackoverflow.com/questions/7452341/what-does-void-0-mean) – Carlinhos

4

Ein winziger Neben dieser sehr, sehr alten Thread ..

Sagen wir your'e in einer for Schleife und benötigen eine Variable für ein truthy/falsy Wert mit einem ternären Operator zu bewerten, während falls es falsy ist möchten Sie continue - du wirst ein Problem haben, weil your'e keine Rückkehr Ausdruck, geben Sie stattdessen eine Anweisung ohne Wert zurück.

wird diese Uncaught SyntaxError: Unexpected token continue

for (var i = 0; i < myArray.length; i++) { 
     myArray[i].value ? alert('yay') : continue; 
} 

So produzieren, wenn Sie eine Anweisung zurückkehren wollen und immer noch eine Zeile für Ihren Code verwenden, während es auf den ersten Blick irgendwie seltsam erscheinen mag und strenge nicht Sprachgebrauch folgen Sie können diese stattdessen tun:

for (var i = 0; i < myArray.length; i++) { 
     if (myArray[i].value) alert('yay') ; else continue; 
    } 
  • PS - Dieser Code kann schwierig sein, zu lesen oder zu verstehen, so wird es nicht immer die beste Option zu verwenden. Sag einfach .. :)