2012-07-25 78 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