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
或查找模式将其抽象到字典查找中。如果看不到代码的其他部分,就无法确定地告诉您。@elclarsMajor
、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=');
}
}