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

Javascript 这';开关';应该是';如果';-为什么?,javascript,jshint,Javascript,Jshint,我正在运行代码,遇到以下错误: 如果 在这段代码上: 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 &&

我正在运行代码,遇到以下错误:

如果

在这段代码上:

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 */
}
开关(真)
{
案例主===0&&Minor==0&&Patch<433:
升级=升级。替换(/(\s+)技能(\d)=/gm,$1section\u 8\u$2\u body=');
/*失败*/
案例主===0&&Minor==0&&Patch<442:
升级=升级。替换(/test=/gm,'void=');
/*失败*/
大小写主===0&&Minor==0&&Patch<459:
升级=升级。替换(/other=/gm,'void=');
/*失败*/
}
我在谷歌上找到了,但看起来是因为只有一个
案例

我怎样才能解决这个问题?我看不出这个
开关应该是
if
的原因。我使用的开关(true)
与此有关吗


旁白:在线版本(我使用的是记事本++插件)上的代码没有问题。

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

该代码本质上是以下各项的快捷方式:

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
}
if(补丁<433){
//...
}否则如果(补丁<442){
//...
}否则如果(补丁<459){
//...
}否则{
//…失败
}

我会做如下事情:

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=');
    }
}
if(主===0&&Minor==0){
如果(补丁<433){
升级=升级。替换(/(\s+)技能(\d)=/gm,$1section\u 8\u$2\u body=');
}
如果(补丁<442){
升级=升级。替换(/test=/gm,'void=');
}
如果(补丁<459){
升级=升级。替换(/other=/gm,'void=');
}
}

它保持了语句的干燥剂,并且在imo中更容易阅读。如果您对一个值执行直接相等操作,那么开关将非常有用,但是
我同意JSHint。那个
开关看起来不太好…@elclanrs你会怎么重写它?我有点同意。。。当有很多升级路径时,这可能会成为一个庞然大物。好吧,
补丁
(为什么要领先caps?)似乎是唯一的变量。您可以使用
if、elseif
或查找模式将其抽象到字典查找中。如果看不到代码的其他部分,就无法确定地告诉您。@elclars
Major
Minor
Patch
都是变量。它是加载的文件的版本信息,用于将其升级为与当前运行的软件版本兼容。然后,它似乎是一个很好的对象查找案例。将您的所有案例添加到一个对象,并为每个案例分配一个函数来执行更新所需的操作,然后当您获得当前版本(如果较旧)时,查找此版本的所有更新并执行这些函数。其他变量并不总是0。实际上,这个
开关目前大约有50个
案例
。此外,您的底层代码块可以很容易地重写为
switch(Patch){case 433:…case 442:…case 459:…}
我们只能根据提供的信息提供帮助。如果还有更多需要了解的内容,请编辑您的问题并提供详细信息。因此,您的代码无法正常运行,因为它没有失效。他所说的失效是指,如果它输入第一个If,它将不会执行其他两个If的指令。切换可能会失败,因为在每种情况下都没有“中断”。是的,你是对的,我错过了示例代码中的注释。我将尝试更好的重构……这与问题的区别在于,在问题中,如果开关在任何情况下的计算结果为true,它仍会执行以下操作。在您的解决方案中,它只执行一个操作。例如,如果补丁<433,交换机将升级三次,在您的解决方案中,它只会更改一次。@dajavax我认为不是这样(请原谅双关语)。你能告诉我你的想法背后的原因吗?如果
Patch
<433,则它也是<442和459,因此pllee的代码也会更改
升级
三次,除非在案例开始之前添加中断,否则没有开关继续执行以下案例,即使它们不是真的。编辑:没关系,我不是在做数学。
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=');
    }
}