11

由于NaN === NaN评估为false,是否可以在语句中添加NaN案例?switch

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

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

NaN按原样发送x将转到默认情况。NaN我知道在 switch 语句中有一些使用方法(例如,我可以用if..else语句包围并使用isNaN),但是有没有更直接的方法?

4

4 回答 4

14

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

请始终记住,switch 不会进行隐式类型转换来比较大小写,因此如果您向 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;
    }

如果 x where 是一个字符串,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;
}

布拉德的解决方案:

谢谢布拉德这个。我不太喜欢这个,因为它感觉有点像 hack,也就是说,这不是你期望使用 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;
}
于 2012-07-25T20:58:01.190 回答
3

你可以这样做(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; 
}
于 2012-08-09T20:33:53.660 回答
2

@helmus 的回答是正确的,是一个很好的解决方案。

NaN但是,如果您使用字符串,则可以保持大小写:

switch(x+''){
    case "1":
    case "2":
    case "4":
        doSomething();
        break;
    case "NaN":
        doSomethingElse();
        break;
    default:
        doADifferentThing();
        break;
}
于 2012-07-25T21:01:06.273 回答
0

使用 toString():

switch (x.toString()) {
    case '1':
    case '2':
    case '4':
        console.log('1/2/4');
        break;
    case 'NaN':
        console.log('NaN');
        break;
    default:
        console.log('default');
}
于 2019-10-04T08:00:23.727 回答