为什么Javascript `if..else if'not以'else'结尾

Why would Javascript `if...else if` not end with an `else`?

本文关键字:if else 结尾 not 为什么 Javascript      更新时间:2023-09-26

这是我使用的一个教程中的JavaScript代码片段。我不明白为什么它没有以最后的else子句结尾;我以为这是一条规则。

var curScene = 0;
function changeScene(decision) {
  var message = "";
  if(curScene == 1) {
    message = " welcome";
  } else if (curScene == 2) {
    message = " this is scene two";
  } else if (curScene == 3) {
    message = " this is scene three";
  }
  document.getElementById("sceneimg").src = "scene" + curScene + ".png";
  if(message != ""){
    alert(message);
  }
}

我以为它总是应该以"其他"结尾?

else块是可选的。您可以在没有else的情况下使用if

原因与您可以只有一个if的原因相同:

if( /*condition*/ ) {
    //some code
}
//other stuff

考虑3个场景
场景1:布尔条件

if (condition) {}
else {}

将条件指定为else-if将是多余的,并且对读者来说,代码的作用非常明显。在这种情况下,没有使用else-if的理由。

场景2:无限状态

在这里,我们对条件A和B的测试感兴趣(等等(,如果它们都不成立,我们可能感兴趣,也可能不感兴趣:

if (conditionA) {}
else if (conditionB) {}
else {} // this might be missing as it is in your case

这里重要的一点是,互斥状态的数量不有限,例如:条件a可能是num % 2 == 0,条件B可能是num % 3 == 0

我认为在这里使用合理数量的树枝是自然的,也是可取的;如果分支过多,这可能表明明智地使用OO设计将极大地提高可维护性。

场景3:Finite states

这是前两种情况之间的中间地带:状态的数量是有限的,但多于两个。测试类枚举类型的值是典型的例子:

if (var == CONSTANT_FOO) {}
else if (var == CONSTANT_BAR) {} // either this,
else {} // or this might be missing

在这种情况下,使用开关可能会更好,因为它会立即向读者传达状态的数量是有限的,并强烈提示在哪里可以找到所有可能状态的列表(在本例中,常数以CONSTANT_开头(。我的个人标准是我测试的状态的数量:如果只有一个(没有其他if(,我将使用if;否则,一个开关。无论如何,在这种情况下,我不会写其他if。

添加else作为空捕获错误块

这与上面的场景#2直接相关。除非可能的状态是有限的,并且在编译时是已知的,否则不能说"在任何其他情况下"意味着发生了错误。在场景2中,切换会感觉更自然,我觉得以这种方式使用else有一种糟糕的代码气味。

请改用带有默认分支的开关。它将更清楚地传达你的意图:

switch(direction) {
    case 'up': break;
    case 'down': break;
    default: // put error handling here if you want
}

这可能有点冗长,但读者很清楚代码的工作方式。在我看来,一个空的其他街区在这里会显得不自然和令人费解。

它不必这样做,因为if本身不需要else

通常,作为一种"包罗万象"的情况,拥有一个是个好主意,但上面的代码可以写成:

switch(curScene) {
    case 1: message = " welcome"; break;
    case 2: message = " this is scene two"; break;
    case 3: message = " this is scene three"; break;
}

在上面的代码中,我还可以添加:

    default: message = " invalid curScene value"; break;

但这样做是完全可选的。这取决于curScene变量的可靠性,我个人是否会添加它。

没有else子句在语法上是可以的。MDN文档基本上,如果第二个if成为else的主体,请参阅"如果嵌套正确缩进,它会是什么样子"一节。

至于这是否是一种糟糕的做法,我认为这取决于意图。如果没有明确定义最后一个else子句,您可能会遇到一个错误,其中出现了一个您没有涵盖的条件。考虑一下:

if(myVariable > 0) {
   doSomething();
} else if(myVariable < 0) {
   doSomethingElse();
}

如果myVariable为0,则不会发生任何事情。如果你只是浏览一下代码,你会很难看到。我想说,如果你遇到这种模式,那将是一种代码气味,可能出了问题,但可能没问题。

相同的逻辑总是可以用嵌套的if语句来表达。我会选择可读性更强的。

elseif语句的default case。如果不存在else,则如果ifelse if情况中的条件都不满足,则if状态将不起作用。

通常情况下,有一个默认情况是很好的做法,但在很多情况下,它是不必要的,因此被排除在代码之外。

在这种情况下,如果curScene是除1, 2, 3之外的任何东西,则将使用else语句,但是由于在其他情况下没有要进行的处理,所以编码器没有包括else

是的,总是有一个其他是非常好的习惯(与if-elseif一起使用时(。有时人们甚至会这样写:

if(curScene == 1) {
    message =" welcome";
else if (curScene == 2) {
    message = " this is scene two";
}
else if (curScene == 3) {
    message = " this is scene three";
} else {
    // empty.
}

告诉人们在其他事情上确实没有什么可做的。

将应答验证的if条件if(answer==100(更改为if(ansswe==100(它现在运行良好。。。