这个'开关'应该是'如果' - 为什么?

时间:2013-09-25 22:12:44

标签: javascript jshint

我正在通过JSHint运行我的代码,而且我遇到了这个错误:

  

switch应为if

在这段代码上:

switch(true)
{
    case Major === 0 && Minor === 0 && Patch < 433:
        upgraded = upgraded.replace(/(\s+)skill(\d)=/gm, '$1section_8_$2_body=');
    /* falls through */
    case Major === 0 && Minor === 0 && Patch < 442:
        upgraded = upgraded.replace(/test=/gm, 'void=');
    /* falls through */
    case Major === 0 && Minor === 0 && Patch < 459:
        upgraded = upgraded.replace(/another=/gm, 'void=');
    /* falls through */
}

从谷歌搜索我发现this Github issue,但看起来那是因为只有case

我该如何解决这个问题?我认为switch没有理由应该是if。我使用switch(true)的事实可能与它有关吗?

除此之外:代码在网上版本上很好(我使用的是Notepad ++插件)。

2 个答案:

答案 0 :(得分:1)

我会做类似的事情:

if(Major === 0 && Minor === 0){
    if(Patch < 433) {
        upgraded = upgraded.replace(/(\s+)skill(\d)=/gm, '$1section_8_$2_body=');
    }
    if(Patch < 442) {
        upgraded = upgraded.replace(/test=/gm, 'void=');
    }
    if(Patch < 459) {
        upgraded = upgraded.replace(/another=/gm, 'void=');
    }
}

它保持语句DRYer并且更容易阅读imo。如果您对值进行直接相等,但<取消了switch语句的所有“优点”,那么切换将非常有用。

答案 1 :(得分:-1)

switch语句用于根据有限的已知可能值列表测试单个变量或表达式(枚举

var userColor = 'red';

switch(userColor){
  case 'red':
      alert('Stop');
      break;
  case 'yellow':
      alert('Slow');
      break;
  case 'green':
      alert('Go');
      break;
}

该代码本质上是一个快捷方式:

if(userColor == 'red'){
  alert('Stop');
}else if(userColor == 'yellow'){
  alert('Slow');
}else if(userColor == 'green'){
  alert('Go')
}

在您提供的代码中,唯一的决定因素是Patch的值,因为其余变量始终为0。

我建议您将代码重构为一系列if / else语句

if(Patch < 433){
  //...
}else if(Patch < 442){
  //...
}else if(Patch < 459){
  //...
}else{
  //... fall through
}