2012-07-25 9 views
8

Da NaN === NaN ausgewertet false, ist es möglich, einen NaN Fall zu einer switch Anweisung hinzufügen?Wie haben Sie einen NaN-Fall in einer switch-Anweisung?

Zum Beispiel lassen Sie sie sagen, dass ich die folgenden Schalter machen will:

switch(x){ 
    case 1: 
    case 2: 
    case 4: 
     doSomething(); 
     break; 
    case NaN: 
     doSomethingElse(); 
     break; 
    case default: 
     doADifferentThing(); 
     break; 
} 

Senden NaN als x zum Standardfall gehen. Ich weiß, dass es Möglichkeiten gibt, NaN in Switch-Anweisungen zu verwenden (z. B. kann ich mit einer if..else-Anweisung umgeben und isNaN verwenden), aber gibt es einen direkteren Ansatz?

+2

Ich glaube, der einzige Weg, t zu tun Das ist 'switch (true)' mit 'case x === 1' und' case isNaN (x) 'Anweisungen. Nicht die ideale Struktur, aber funktioniert. – Brad

+2

Sie könnten einfach im Normalfall isNan machen und Ihre Logik dementsprechend ändern. – nolegs

+1

Setzen Sie 'case' Blöcke für jeden anderen möglichen Wert von' x' und dann 'default' wird' NaN'. :) – tenfour

Antwort

6

ich mich sah nur eine Lösung ursprünglich geschrieben, aber während meines Schlafes kam ich mit einer hervorragenden Lösung auf.

Denken Sie immer daran, dass ein Switch keine implizite Typkonvertierung durchführt, um die Fälle zu vergleichen. Wenn Sie der switch-Anweisung also eine Zeichenfolge angeben, wird sie nicht mit Ganzzahlen in den Fällen übereinstimmen und umgekehrt. Wenn Sie mit Strings und Integern vergleichen möchten, müssen Sie zuerst Ihre ganze Zahl in eine Zeichenkette umwandeln und dann nur mit Strings vergleichen.

Die hervorragende Lösung:

Wie WouterH wies darauf hin, wird meine erste Lösung auf Standard lösen, wenn eine Zeichenfolge verwenden, die eine Zahl enthält, wird dieses Verhalten für switch-Anweisungen erwartet. Aber es könnte nützlich sein, das Argument zu analysieren, um dies zu überwinden. Dafür können Sie folgenden Code verwenden:

var x = "1"; 
switch (isNaN(x) || parseInt(x)) 
{ 
    case true: 
     alert("IsNaN!") 
     break; 
    case 1: 
     alert("1"); 
     break; 
    case 2: 
     alert("2"); 
     break; 
    case 4: 
     alert("4"); 
     break; 
    default: 
     alert("default"); 
     break; 
} 

Meine ersten hervorragende Methode:

var x = "clearly not a number"; 
switch(x){ 
    case !isNaN(x) || x: 
     alert("IsNaN!") 
     break; 
    case 1: 
     alert("1"); 
     break; 
    case 2: 
     alert("2"); 
     break; 
    case 4: 
     alert("4"); 
     break; 
    default: 
     alert("default"); 
     break; 
    } 

isNaN gibt true zurück, wenn x, wo eine Zeichenkette sein, aber es ist nicht wirklich wichtig, weil wahr gewonnen Wird aufgrund des oben erwähnten Verhaltens der switch-Anweisung nicht als wahr interpretiert.

Meine ursprüngliche Lösung:

Ich weiß nicht einmal, was ich dachte, das sieht schrecklich und die Vertiefung ist einfach nur peinlich, aber danke für das upvotes!

var x = "clearly not a number"; 
switch(x){ 
    case 1: 
     alert("1"); 
     break; 
    case 2: 
     alert("2"); 
     break; 
    case 4: 
     alert("4"); 
     break; 
    case default: 
     if (isNaN(x)){ 
      alert("isNaN"); 
      break; 
     } 
     alert("default"); 
     break; 
} 

Brad Lösung:

thx an Brad für diese ein. Ich mag das nicht wirklich, weil es sich ein bisschen wie ein Hack anfühlt, das heißt, das ist nicht die Art, wie Sie eine Case-Anweisung verwenden würden, aber es gibt Ihnen die größte Flexibilität, also bin ich mir sicher Es gibt einen Anwendungsfall dafür.

var x = "clearly not a number"; 
switch(true) 
{ 
    case x==1: 
     alert("1"); 
     break; 
    case x==2: 
     alert("2"); 
     break; 
    case IsNaN(x): 
     alert("IsNaN"); 
     break; 
    case default: 
     alert("default"); 
     break; 
} 
+1

Sorry, aber die hervorragende Lösung schlägt fehl, wenn Sie eine Zahl als String übergeben: 'var x =" 1 ";' siehe [jsFiddle] (http://jsfiddle.net/MAAV5/) –

+1

@WouterH, dies ist das erwartete Verhalten einer switch-Anweisung, es macht keine impliziten Konvertierungen, wie ich explizit in meinem Beitrag darauf hingewiesen habe, bitte sehen Sie diese jsFiddle für den Beweis http://jsfiddle.net/DYcfP/1/ –

+0

Für 'x =" 1 "Ich würde erwarten, dass es" 1 "oder" IsNaN! "Alert, aber nicht" default ". –

2

@ helmus Antwort ist richtig und ist eine gute Lösung.

Sie können jedoch die NaN Fall pflegen, wenn Sie Zeichenfolgen verwenden:

switch(x+''){ 
    case "1": 
    case "2": 
    case "4": 
     doSomething(); 
     break; 
    case "NaN": 
     doSomethingElse(); 
     break; 
    default: 
     doADifferentThing(); 
     break; 
} 
+1

Das wird funktionieren, solange Sie wissen, 'x' ist nicht' null' oder ' undefiniert. Sie könnten stattdessen 'x +" "' tun. –

+0

Danke, ich habe die Antwort korrigiert :) –

+0

... und technisch gesprochen, 'NaN! ==" NaN "'. – josh3736

2

Warum nicht einfach tun dies (jsFiddle):

var x = "test"; 
switch (isNaN(x) || x) 
{ 
    case true: 
     alert("IsNaN!") 
     break; 
    case 1: 
     alert("1"); 
     break; 
    case 2: 
     alert("2"); 
     break; 
    case 4: 
     alert("4"); 
     break; 
    default: 
     alert("default"); 
     break; 
} 

Oder, wenn Sie wollen auch Zeichenfolge enthält ein validieren Nummer (jsFiddle):

var x = "1"; 
switch (isNaN(x) || parseInt(x)) 
{ 
    case true: 
     alert("IsNaN!") 
     break; 
    case 1: 
     alert("1"); 
     break; 
    case 2: 
     alert("2"); 
     break; 
    case 4: 
     alert("4"); 
     break; 
    default: 
     alert("default"); 
     break; 
} 
+0

ausgezeichneten Vorschlag verwenden wird, ich habe es optimiert und es in meinen Beitrag aufgenommen! –

Verwandte Themen