2010-07-02 12 views
11
the_styles ? the_styles.appendTo('head'); the_styles=null : the_styles = $('.stylesheet').detach(); 

Offensichtlich ist dies nicht gültig. Beachten Sie das ";" zwischen appendTo() und the_styles=null. Wie schreibe ich es in 1 Zeile und habe immer noch mehrere Ausdrücke?Ternärer Operator in JavaScript mit mehreren Ausdrücken?

+0

Nur ein Ratschlag: der ternäre Operator in einigen anderen Sprachen wird nicht verwendet, um vollständige Anweisungen zu schreiben, sondern nur den Ausdrucksteil (d. H. Den Teil rechts vom '=' Zeichen). In Java würde das überhaupt nicht kompilieren. Es ist besser, keine Gewohnheit daraus zu machen. – FK82

Antwort

19

der Komma-Operator auf diese Weise verwenden:

the_styles ? (the_styles.appendTo('head'), the_styles=null) : the_styles = $('.stylesheet').detach(); 

Hier ist, was der Mozilla Developer Center über den Komma-Operator schreibt:

Sie können die Komma-Operator verwenden, wenn Sie aufnehmen möchten mehrere Ausdrücke an einem Ort, der einen einzelnen Ausdruck erfordert. Die häufigste Verwendung dieses Operators ist die Bereitstellung mehrerer Parameter in einer for-Schleife.

Lesen Sie mehr hier: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Special_Operators/Comma_Operator

+0

Das ist eine wirklich ordentliche Form. Ich habe auch nicht erwartet, dass die Zahnspange die Bedeutung der Aussage so tiefgreifend verändert.Ich glaube nicht, dass ich das sogar zufällig schreibe, sondern vergleiche 'var x = 1, y = 2, z = 3;' und 'var x = (1, y = 2, z = 3);'. Im ersten Fall wird "x" auf "1" gesetzt. Im zweiten Fall wird "x" auf "3" gesetzt. Das ist wirklich, wirklich ordentlich. – Andrew

2
the_styles ? (function() {the_styles.appendTo('head'); the_styles=null})() : <etc> 

einfach den Code-Block in (function() { und })() wickeln.

Jetzt für den schwierigen Teil: warum möchten Sie dies tun? Vielleicht gibt es eine bessere Lösung!

+1

Ja, das ist hässlich, vergiss es. Ich mag nur Ternärs, weil sie sauber sind und eine einzige Linie ist alles. –

+0

Solange der Code in jedem Zweig eine einzelne "Zeile" ist, sind sie nett. Ansonsten ... mehrere Zeilen verwenden! – mcherm

1

i mit glowcoder zustimmen, aber wenn Sie es noch wollen:

the_styles ? function(){ the_styles.appendTo('head'); the_styles=null;}() : the_styles = $('.stylesheet').detach(); 
+0

Ja, ich auch jetzt, danke! –

0
the_styles ? the_styles.appendTo('head') : the_styles = $('.stylesheet').detach(); 

Sie nicht brauchen, um es zu null, wenn Ihr es überschrieben wird!

+0

Ich brauche die Null, denn wenn nicht, behält sie den gleichen Wert nach dem ersten Klick und ich brauche eine "off/on" -Funktion. –

0
the_styles=the_styles || $('.stylesheet').detach(); the_styles.appendTo('head'); 
+0

Funktioniert nicht ... :( –

8

Wer den ternären Operator benötigt?

​the_styles = !the_styles && $('.stylesheet').detach()​​​​ || 
      the_styles.appendTo('head') && null;​ 

Hätten die Ausdrücke um, da sonst die null Wert des ersten Ausdrucks zu wechseln immer den zweiten Ausdruck zwingen .detach() ausgewertet werden.

Die einzige Sache über cleveren Code ist, dass wenn Sie nach einer Kaffeepause wieder darauf zurückkommen, es für Sie keinen Sinn ergeben wird. Also das ist viel besser:

if(the_styles) { 
    the_styles.appendTo('head') 
    the_styles = null; 
} 
else { 
    the_styles = the_styles.detach('.stylesheet'); 
} 

Für mich macht selbst die oben vereinfachte Version keinen Sinn. Die was Teil ist offensichtlich, aber warum macht es das?

+0

+1 - Ich hatte eine ähnliche Antwort, aber missverstanden die Absicht. Deines hat recht. – user113716

+1

@patrick - Ich habe eine Weile gebraucht, um den Kurzschluss zu bewerten, der immer ein schreiendes Signal ist, nicht zu versuchen, clever zu sein :) – Anurag