你如何在switch语句中有一个NaN案例?

Mic*_*man 10 javascript

NaN === NaN评估以来false,是否可以在语句中添加NaN案例switch

例如,假设我想进行以下切换:

switch(x){
    case 1:
    case 2:
    case 4:
        doSomething();
        break;
    case NaN:
        doSomethingElse();
        break;
    case default:
        doADifferentThing();
        break;
}
Run Code Online (Sandbox Code Playgroud)

发送NaN作为x必去的默认情况.我知道有很多方法可以NaN在switch语句中使用(例如我可以使用if..else语句并使用isNaN),但是有更直接的方法吗?

Wil*_*eer 11

我最初写道,我只看到了一个解决方案,但是在我睡觉的时候,我想出了一个极好的解决方案.

始终记住,交换机不进行隐式类型转换来比较这些情况,因此如果您为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; 
}
Run Code Online (Sandbox Code Playgroud)

我最初的精湛方法:

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;
    }
Run Code Online (Sandbox Code Playgroud)

如果x在哪里成为一个字符串,则isNaN将返回true但是它并不重要,因为由于switch语句的上述行为,true将不会对字符串求值为true.

我原来的解决方案

我甚至不知道我在想什么,这看起来很可怕,缩进只是简单的尴尬,但感谢你的赞成!

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;
}
Run Code Online (Sandbox Code Playgroud)

布拉德的解决方案:

对于这一个来说是布拉德.我真的不喜欢这个,因为它感觉有点像黑客,也就是说,这不是你期望使用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;
}
Run Code Online (Sandbox Code Playgroud)