2016-08-03 35 views
2

Dies ist sehr ähnlich zu default as first option in switch statement?, aber in Bezug auf JS statt PHP.Javascript switch statement - Standard zuerst OK?

Ich habe eine Hilfsfunktion, die verschiedene Aufrufstile für eine andere Funktion umschließt. Die umbrochene Funktion benötigt mindestens eine und kann bis zu 4 Parameter akzeptieren. Was ich gerade mache, wird in diesem Code-Beispiel, das in meinen Versionen von Chrome und FF funktioniert, ziemlich gut beschrieben.

function testSwitch(definition) { 
    var term, minLength, boundaryStart, boundaryEnd; 
    switch (definition.length) { 
     default: 
    case 4: 
     boundaryEnd = definition[3]; 
    case 3: 
     boundaryStart = definition[2]; 
    case 2: 
     minLength = definition[1]; 
    case 1: 
     term = definition[0]; 
     break; 
    case 0: 
     console.log('fail') 
     return; 
    } 
    console.log(term, minLength, boundaryStart, boundaryEnd); 
} 

(Im realen Anwendungsfall werden sie an die eigentliche Funktion statt console.log übergeben). Die Idee ist also, durch die Fälle zu gehen, so dass zu viele Parameter bereitgestellt werden können (aber die zusätzlichen ignoriert werden), aber fehlgeschlagen, wenn die angegebene Definition leer ist.

Also weiß ich aus meinen Tests, dass dies zumindest in einigen Browsern funktioniert, kann ich mich darauf verlassen, dass dies über relativ neue Browser funktioniert (z. B. iOS/Android-Geräte, IE8 +, Edge usw.)? Ich weiß, dass das Ausschließen der break-Anweisung wohldefiniertes Verhalten ist und ziemlich breit verwendet wird, bin aber nicht so sicher, ob der Standardfall zuerst und leer ist (zB wenn einige Browser-JS-Engines den leeren Standardfall optimieren würden, tut dies nicht) arbeite für mich, da es bei einem Aufruf mit einem Array der Größe 5 nicht funktionieren würde).

+0

Ihr Szenario auf Firefox funktioniert für mich 48. Ich denke, es sollte auf alle JS arbeiten Ich glaube nicht, dass eine JS-Engine den 'default'-Fall optimieren würde, da dies den Kontrollfluss definitiv ändern würde. – Xufox

Antwort

2

Ich habe noch nie jemanden gesehen, der diesen Ansatz benutzt. Es ist schlau. Als Randnotiz ist clever eine zweischneidige Klinge; Wenn dies ein Code ist, den jemand anders als Sie berühren wird, schlage ich Ihnen dringend einen Kommentar vor, um klarzustellen, dass Sie das absichtlich getan haben oder jemand es ändern wird (weil es 'falsch aussieht') und es bricht, ohne die Absicht zu erkennen .

Die documentation indicates, dass default nicht die letzte Klausel sein muss.

Wenn Sie einen Browser finden waren es nicht funktioniert, können Sie es ändern etwas so und vermeiden die default:

function testSwitch(definition) { 
    var term, minLength, boundaryStart, boundaryEnd; 
    switch (definition.length > 4 ? 5 : definition.length) { 
    case 5: 
    case 4: 
     boundaryEnd = definition[3]; 
    case 3: 
     boundaryStart = definition[2]; 
    case 2: 
     minLength = definition[1]; 
    case 1: 
     term = definition[0]; 
     break; 
    case 0: 
     console.log('fail') 
     return; 
    } 
    console.log(term, minLength, boundaryStart, boundaryEnd); 
} 
+0

Danke - Ich hatte tatsächlich über genau diese Seite geforscht, und wenn ich das gesehen hätte "Nach der Konvention ist die Standardklausel die letzte Klausel, aber es muss nicht so sein." Zitat dann hätte es meine Frage beantwortet, aber irgendwie habe ich es jedes Mal direkt gescannt. Definitiv zustimmen, dass es kommentiert wird, mit einem Link zu dieser Antwort enthalten. –