2012-07-25 61 views
8

由於NaN === NaN的計算結果爲false,是否可以將NaN個案添加到switch陳述中?如何在switch語句中有NaN情況?

例如,假設我想提出以下開關:

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

發送NaN作爲x會去的默認情況。我知道在開關語句中可以使用NaN(例如,我可以用if..else語句環繞並使用isNaN),但是有沒有更直接的方法?

+2

我相信唯一的辦法是做t他是'switch(true)',case'=== 1',case是NNN(x)'語句。不是最理想的結構,但確實有效。 – Brad 2012-07-25 20:55:49

+2

您可以在默認情況下執行isNan,並相應地更改您的邏輯 – nolegs 2012-07-25 20:57:13

+1

將'case'的每個其他可能的值放入'x',然後'default'將會是'NaN'。 :) – tenfour 2012-07-25 21:00:12

回答

6

我最初寫道我看到只有一個解決方案,但是在我的睡眠期間,我想出了一個極好的解決方案。

請務必記住,開關不會執行隱式類型轉換來比較案例,因此如果您向switch語句提供了一個字符串,它將不會與案例中的整數相匹配,反之亦然。 如果你想比較字符串和整數,你將不得不把你的整數轉換爲一個字符串,然後再比較字符串。

高超的解決方案:

正如WouterH指出的那樣,我最初的解決方案將解決使用一個包含數字的字符串時,默認情況下,預計switch語句的行爲。但是爲了解決這個問題,分析這個論證可能是有用的。對於您可以使用下面的代碼:

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; 
} 

我最初精湛的方法

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將返回true,如果X到那裏是一個字符串,但它其實並不重要,因爲真正韓元由於switch語句的上述行爲,因此不會評估爲字符串。

我原來的解決方案:

我甚至不知道我在想什麼,這看起來可怕的,壓痕只是普通的尷尬,但感謝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; 
} 

布拉德的解決方案:

THX布拉德這一個。 我不太喜歡這個,因爲它感覺有點像黑客攻擊,也就是說,這不是你希望如何使用case語句,但它確實給了你最大的靈活性,所以我很肯定有一個用例。

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

對不起,但是當你將一個數字作爲一個字符串傳遞時,超級解決方案失敗:'var x =「1」;'see this [jsFiddle](http://jsfiddle.net/MAAV5/) – 2012-08-09 20:10:13

+1

@WouterH,this是switch語句的預期行爲,它不會執行隱式轉換,就像我在文章中明確指出的那樣,請參閱此jsFiddle以供證明http://jsfiddle.net/DYcfP/1/ – 2012-08-09 20:34:45

+0

對於'x =「1 「'我希望它會提醒'1'或'IsNaN!',但不是'default'。 – 2012-08-09 20:37:08

2

@ helmus的回答是正確的,是一個很好的解決方案。

然而,如果你使用字符串就可以保持NaN情況:

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

只要您知道'x'不是'null'或' undefined'。你可以用'x +「」'代替。 – 2012-07-25 21:04:04

+0

謝謝,我已經糾正了答案:) – 2012-07-25 21:05:21

+0

......從技術上講,'NaN!==「NaN」'。 – josh3736 2012-07-25 21:05:34

2

爲什麼就不能做到這一點(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; 
} 

或者,如果你也想驗證包含字符串號碼(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

出色的建議,我優化了它並將它包含在我的文章中! – 2012-08-09 21:13:03

相關問題