Javascript 如何在switch语句中使用NaN case?

Javascript 如何在switch语句中使用NaN case?,javascript,Javascript,由于NaN===NaN的计算结果为false,是否可以将NaN大小写添加到开关语句中 例如,假设我要进行以下切换: switch(x){ case 1: case 2: case 4: doSomething(); break; case NaN: doSomethingElse(); break; case default: doADifferentThing();

由于
NaN===NaN
的计算结果为
false
,是否可以将
NaN
大小写添加到
开关
语句中

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

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

NaN
作为
x
发送将进入默认情况。我知道在switch语句中使用
NaN
是有办法的(例如,我可以用
if..else
语句包围并使用
isNaN
),但是有没有更直接的方法呢?

我最初写过一篇文章,我只看到了一个解决方案,但在睡觉时我想出了一个极好的解决方案

请始终记住,开关不会进行隐式类型转换来比较大小写,因此,如果为开关语句提供字符串,则它将不会与大小写中的整数匹配,反之亦然。 如果要与字符串和整数进行比较,必须先将整数转换为字符串,然后仅与字符串进行比较

卓越的解决方案:

正如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; 
}
我最初的方法是:

如果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;
}
布拉德的解决方案:

这一次谢谢布拉德。 我真的不喜欢这个,因为它感觉有点像黑客,也就是说,这不是你期望使用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;
}

@赫尔姆斯的回答是正确的,是一个很好的解决方案

但是,如果使用字符串,则可以维护
NaN
案例:

switch(x+''){
    case "1":
    case "2":
    case "4":
        doSomething();
        break;
    case "NaN":
        doSomethingElse();
        break;
    default:
        doADifferentThing();
        break;
}
您可以这样做():

或者,如果还希望验证包含数字()的字符串:

使用toString():


我认为唯一的方法是使用
case x==1
case isNaN(x)
语句切换(true)。这不是最理想的结构,但确实有效。您可以在默认情况下执行isNan,并根据每个其他可能的
x
值放置
case
块来更改逻辑,然后
default
将为
NaN
:)只要您知道
x
不是
null
未定义
,这就行了。你可以用
x+“”
来代替……从技术上讲,
NaN!==“NaN”
.Oops,只是又一次可能的破损。如果它是数组中的一个数字,如
[1]
,字符串转换将为“1”。我想这取决于OP想要什么样的强迫,如果有的话。
switch
语句是一个严格的比较语句,因此可能不需要强制值。如果x包含字符串“NaN”,这将解析为错误case@josh3736我知道,这就是我将
x
和所有大小写转换为字符串的原因。然后比较将是
“NaN”==“NaN”
对不起,但是当您将数字作为字符串传递时,超级解决方案将失败:
var x=“1”
看到这个@wouther,这是switch语句的预期行为,它不会进行隐式转换,就像我在帖子中明确指出的那样,请查看这个jsFiddle以证明
x=“1”
我希望它发出警报
1
IsNaN
,但不是
默认值
@wouther这是javascript开关语句的工作方式,所以正如预期的那样,但您的解析方法确实提供了一个可能有用的额外功能哦,伙计,它看起来棒极了。但同时,我绝不允许类似的东西通过代码审查:)非常好的建议,我优化了它,并将其包含在我的帖子中!
switch(x+''){
    case "1":
    case "2":
    case "4":
        doSomething();
        break;
    case "NaN":
        doSomethingElse();
        break;
    default:
        doADifferentThing();
        break;
}
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; 
}
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; 
}
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');
}