Es gibt vier Möglichkeiten, einen JavaScript-Schalter zu schreiben. Wissen Sie? Ob Sie es wissen oder nicht, ich weiß es nicht.
Es gibt nur eine Möglichkeit, die JavaScript-Switch-Anweisung zu schreiben, die mir bekannt ist. Aber wenn es um den Umgang mit Zweigen geht, gibt es viele Möglichkeiten, sie zu schreiben. Die If-Zweig-Schreibmethode kann als eine gezählt werden, die Switch-Zweig-Schreibmethode kann als zweite gezählt werden und die dritte besteht darin, den Strategiemodus zu verwenden. Wenn auch bedingte Operatoren enthalten sind, gibt es genau vier.
aber der Protagonist dieses Artikels ist Switch. Jeder weiß, dass Switch im Allgemeinen als Switch-Variable oder Switch-Ausdruck und Case-Konstante geschrieben wird. Bei einer Punktzahl von 100 Punkten gelten beispielsweise 90 und mehr als ausgezeichnet, 80 und mehr und unter 90 gelten als gut, 60 und mehr und unter 80 gelten als qualifiziert und unter 60 gelten als nicht qualifiziert würde wahrscheinlich so geschrieben werden:
function calcGrade(score ) { const line = Punktzahl / 10 |. Schalter (Leitung) { Fall 10: Fall 9: Rückgabe „Ausgezeichnet“; Fall 8: „gut“ zurückgeben; Fall 7: Fall 6: Rückgabe „qualifiziert“; Standard: Rückgabe „unqualifiziert“; } }
Im Code hat score / 10 | 0
den gleichen Effekt wie Math.floor(score / 10)
, nämlich die Division durch 10, um den ganzzahligen Teil des Quotienten zu erhalten.
Dieser Schalter wird recht gut verwendet, und die Rundungsmethode, um die Verwendung einer langen Liste von if...else-Zweigen zu vermeiden, ist ebenfalls ein cleverer Trick.
Aber jetzt haben sich die Regeln geändert und der Trennpunkt zwischen qualifiziert und gut wurde von 80 auf 75 Punkte gesenkt. Was sollen wir tun?
Die obige Rundungsmethode ist weiterhin möglich, allerdings ist der Teiler dieses Mal nicht mehr 10, sondern 5. Dementsprechend gibt es viel mehr Fälle:
Es ist besser, 9 Fälle zu verwenden wenn... sonst.
Ist es? Tatsächlich gibt es eine einfachere Möglichkeit, mit dem Schalter zu schreiben:
function calcGrade(score) { switch (wahr) { Fallpunktzahl >= 90: Rückgabe „Ausgezeichnet“; Fallbewertung >= 75: „gut“ zurückgeben; Fallbewertung >= 60: Rückgabe „qualifiziert“; Standard: Rückgabe „unqualifiziert“; } }
Fühlt es sich etwas seltsam an? Dabei handelt es sich überhaupt nicht um die übliche Schalterausdruck-Fallkonstante, sondern um das genaue Gegenteil, den Schalterkonstanten-Fallausdruck! Wenn Sie dieses Programm nehmen und ausführen, werden Sie feststellen, dass es überhaupt kein Problem gibt. Da - Schalter und Groß-/Kleinschreibung gemäß ===
übereinstimmen , ist es egal, ob es sich um einen Ausdruck oder eine Konstante handelt, oder mit anderen Worten, auf Schalter und Groß-/Kleinschreibung kann ein Ausdruck folgen!
Ja, Ausdruck!
Im obigen Beispiel hat die Änderung switch(true)
switch( 2 > 1)
den gleichen Effekt.
Okay, mein Geist ist offen. Es spielt keine Rolle, auf wie viele Arten Sie „switch“ schreiben können. Als nächstes sollte man sich die Switch-Variante ansehen.
: Ich habe gesehen, dass C# einen Switch-Ausdruck hat, und ich bin neidisch. Kann er implementiert werden?
Keine Sorge, alles in JavaScript kann ein Ausdruck sein ... Wenn nicht, verwenden Sie einfach IIFE, um eine
Funktion zu kapseln calcGrade(score) { return (Wert => { switch (wahr) { Fallwert >= 90: Rückgabe „Ausgezeichnet“; Fallwert >= 75: „gut“ zurückgeben; Fallwert >= 60: Rückgabe „qualifiziert“; Standard: Rückgabe „unqualifiziert“; } })(Punktzahl); }
Beachten Sie, dass score
hier als Parameter von IIFE verwendet wird, da bei der tatsächlichen Verwendung möglicherweise ein Ausdruck übergeben werden muss. In diesem Fall sollte die Evaluierung vorab und nur einmal erfolgen (um Substitutionsnebenwirkungen zu vermeiden).
Eine solche Kapselung ist jedoch offensichtlich bedeutungslos. Wenn Sie sie wirklich so kapseln möchten, ist es besser, sie als Strategie zu kapseln:
function calcGrade(score) { return ((Wert, Regeln) => Rules.find(({ t }) => t(Wert)).v)( Punktzahl, [ { t: n => n >= 90, v: „Ausgezeichnet“ }, { t: n => n >= 75, v: "Gut" }, { t: n => n >= 60, v: "Qualifiziert" }, { t: () => true, v: "unqualifiziert" }, ] ); }
Jede Strategie ist ein Objekt, das einen Tester ( t
) und einen Wert ( v
) enthält. tester ist eine Beurteilungsfunktion, die den Wert übergibt, der beurteilt werden muss, was hier der Ausdruck in switch (表达式)
ist, und dieser Ausdruck wird nach vorheriger Auswertung auch als Parameter von IIFE übergeben. Der Prozess der Anwendung einer Strategie ist einfach und grob. Er besteht darin, die erste Strategie zu finden, die die Bedingungen erfüllt, und ihren Wert zu ermitteln.
Natürlich ist diese Strategie etwas übertrieben. Wenn Sie wirklich eine Strategie verwenden müssen, handelt es sich bei der Strategie normalerweise nicht um einen Wert, sondern um ein Verhalten, also eine Funktion.
Wir wissen, dass sich in der Switch-Anweisung jeder Fall im selben Bereich befindet, sodass dieselbe lokale Variable nicht in zwei Case-Anweisungen deklariert werden kann. Obwohl das Umschließen mit { }
diese Probleme lösen kann, sieht der Code nicht sehr gut aus. Achten Sie insbesondere darauf, break
nicht zu vergessen. Wenn Sie eine Strategie verwenden, sieht diese möglicherweise optisch ansprechend aus, und Sie müssen sich keine Gedanken über das Unterbrechungsproblem machen:
Hier werden zu Demonstrationszwecken im Strategieverhalten zuerst die Ergebnisse und dann die Ebene ausgegeben zurückgegeben.
Funktion calcGrade(score) { return ((Wert, Regeln) => Regeln.find(({ t }) => t(Wert)).fn(Wert))( Punktzahl, [ { t: n => n >= 90, fn: Ergebnis => { const grade = „Ausgezeichnet“; console.log (Note, Punktzahl); Rücknote; } }, { t: n => n >= 75, fn: Ergebnis => { const grade = „gut“; console.log (Note, Punktzahl); Rücknote; } }, { t: n => n >= 60, fn: Ergebnis => { const grade = „bestanden“; console.log (Note, Punktzahl); Rücknote; } }, { t: () => wahr, fn: Ergebnis => { const grade = „unqualifiziert“; console.log (Note, Punktzahl); Rücknote; } }, ] ); }
Der Code ist tatsächlich etwas lang, da er eine strategische Verhaltenslogik enthält. Wenn es wirklich als Switch -Ausdruck verwendet werden soll, sollte der Strategieteil ein Ausdruck sein und nicht zu lang sein. Im obigen Code ist das Strategieverhalten ähnlich und kann in eine Funktion gekapselt werden, sodass es in Form eines Ausdrucks geschrieben werden kann:
function calcGrade(score) { const printGrade = (Note, Punktzahl) => { console.log (Note, Punktzahl); Rücknote; }; return ((Wert, Regeln) => Regeln.find(({ t }) => t(Wert)).fn(Wert))( Punktzahl, [ { t: n => n >= 90, fn:Score => printGrade("Excellent", Score) }, { t: n => n >= 75, fn:Score => printGrade("Good", Score) }, { t: n => n >= 60, fn:Score => printGrade("qualified", Score) }, { t: () => true, fn:Score => printGrade("unqualified", Score) }, ] ); }
Sieht es jetzt vorzeigbar aus?
Die oben genannten Codes haben unterschiedliche Formen und bewirken ähnliche Aufgaben. Es gibt keinen Vergleich, welcher Code besser ist. Egal, was Sie mögen, Sie sind elegant; egal, was Sie nicht mögen, Sie werden nicht bevorzugt. Wählen Sie in verschiedenen Situationen einfach den geeigneten Ansatz. Der obige Code verwendet find()
um die Strategie zu finden. Wenn stattdessen filter()
verwendet wird, sieht die Sache anders aus.