2012-07-19 7 views
20

So javascript Ich bin ein Kurz mit if/else Anweisung (ich irgendwo gelesen sie Ternary Aussagen genannt werden?)JavaScript Stenografie if-Anweisung, ohne den sonst Teil

this.dragHandle.hasClass('handle-low') ? direction = "left" : direction = "right"

Dies funktioniert gut, aber Was, wenn ich später nur eine Kurzschrift if verwenden möchte, ohne den else Teil. Wie:

direction == "right" ? slideOffset += $(".range-slide").width()

ist dies überhaupt möglich?

+3

Die Fachausdrücke für diese Fragmente sind _konditionelle Ausdrücke_, die den bedingten Operator_ '?:' Verwenden. Da dieser Operator drei Operanden benötigt, wird er als ternärer Operator bezeichnet. –

+2

2 mal schneller http://jsperf.com/speed-test-for-conditions –

Antwort

32

Sie && Operator verwenden können - zweiter Operand Ausdruck nur ausgeführt, wenn der erste ist wahr

direction == "right" && slideOffset += $(".range-slide").width() 

meiner Meinung nach if(conditon) expression besser lesbar ist als condition && expression

+0

wird wahrscheinlich bei 'if (Bedingung) Ausdruck bleiben - aber gut zu wissen, dass der' && 'Operator in dieser Situation funktioniert! – ahren

+1

look '&&' ist schneller für mich http://jsperf.com/speed-test-for-conditions –

+0

Ich habe vor doppelten Anführungszeichen verwendet und gearbeitet ... etwas wie >>> direction == "rechts"? slideOffset + = $ (". range-slide"). width(): "" .... macht das also irgendwelche Probleme? – hsobhy

2

Nein, dies ist nicht möglich, da der ternäre Operator drei Operanden benötigt.

first-operand ? second-operand (if first evaluates to true) : third-operand (if false) 
2

Was Sie haben, wird nicht funktionieren, aber warum nicht einfach eine Zeile if-Anweisung verwenden.

if(direction == "right") slideOffset += $(".range-slide").width();

Dies beinhaltet weniger Typisierung als die Methode, Ray vorgeschlagen. Natürlich ist seine Antwort gültig, wenn Sie wirklich bei diesem Format bleiben wollen.

0

Diese Frage nicht genau zu beantworten, aber Ternäre ermöglicht es Ihnen, weniger zu schreiben, als Sie gezeigt haben:

direction = this.dragHandle.hasClass('handle-low') ? "left" : "right"; 

Und jetzt, wo ich darüber nachdenke, ja, können Sie Ihre Frage tun:

slideOffset + direction == "right" ? = $(".range-slide").width() : = 0; 

Dies ist eine Theorie. Das nächste Mal, wenn ich die Möglichkeit habe, eine += ternär zu bekommen, werde ich das versuchen. Lass es mich wissen, wie es funktioniert!

+0

Die lustige Sache ist, dass könnte funktionieren. Ich fange an, diese Seite nicht zu mögen – Dale

+0

Die oberste Linie funktioniert absolut – Dale

9

Sie denken es nicht wie ein Steuer- Block (dh: ein Wenn-sonst oder ein Schalter). Es ist nicht wirklich für das Ausführen von Code innerhalb davon gedacht.

Sie können. Es wird nur sehr hässlich, sehr schnell, was den Zweck besiegt.

Was Sie wirklich wollen, um es für ist Werte zuweisen.

Ihr erstes Beispiel nehmen und es auf den Kopf ein wenig drehen, erhalten Sie:

direction = (this.dragHandle.hasClass("handle-low")) ? "left" : "right"; 

See. Nun, was ich getan habe, ist, dass ich etwas genommen habe, das einen if/else oder einen Schalter benötigt hätte, der verwendet worden wäre, um diesen einen Wert zuzuweisen, und ich habe es schön und schön aufgeräumt.

Sie können ein anderes, wenn auch tun Art von ternären:

y = (x === 2) ? 1 : (x === 3) ? 2 : (x === 4) ? 7 : 1000; 

Sie können auch Code Feuer verwenden, wenn Sie möchten, aber es wird wirklich schwierig, nach einer Weile, zu wissen, was gehen, wo (das vorherige Beispiel sehen, um zu sehen, wie selbst Zuordnung auf einem Blick seltsam aussehenden beginnen) ...

((this.dragHandle.hasClass("...")) ? fireMe(something) : noMe(somethingElse)); 

... dies wird in der Regel arbeiten.

Aber es ist nicht wirklich hübscher oder nützlicher als eine wenn oder eine Verzweigung, sofort-aufrufende Funktion (und Nicht-JS-Programmierer oder ungeschulte JS-Programmierer werden sich selbst versuchen, Ihren Code zu pflegen).

+1

"_trained JS Programmierer werden sich selbst versuchen, Ihren Code beizubehalten_" Ich hätte es nicht besser sagen können – ajax333221

2

Der Bedingungsoperator ist nicht eine Abkürzung für die if Aussage. Es ist ein Operator, keine Aussage.

Wenn Sie es verwenden, sollten Sie es als Operator verwenden, nicht als Anweisung.

Verwenden Sie einfach einen Nullwert für den dritten Operanden:

slideOffset += direction == "right" ? $(".range-slide").width() : 0; 
0

ich einen ähnlichen Fall, wo ich nur wollte den if Teil nennen. Erreicht mit dem logischen & & (und) -Operator.

var name = "michael"; 

var doSomething = function() { 
    return (name === "michael") && console.log("name is valid"); 
}; 

doSomething(); // will log name is valid else returns undefined but is disposed of since we never store it.