为什么Javascript` if ... else if`不以`else`结尾?

时间:2011-11-09 05:00:09

标签: javascript if-statement conditional

以下是我正在使用的教程中的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);
  }
}

8 个答案:

答案 0 :(得分:13)

  

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

你错了。 else块是可选的。您可以if没有else

答案 1 :(得分:5)

出于同样的原因,为什么你只能有一个if:

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

//other stuff

答案 2 :(得分:3)

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

if (condition) {}
else {}

如果条件是多余的,则将条件指定为else,并且对于读者而言,代码的作用非常明显。在这种情况下,没有使用else的论据。

场景2: 无限状态

这里我们感兴趣的是测试条件A和B(等等),如果它们都不成立,我们可能会或可能不会对会发生什么感兴趣:

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

这里重点是没有有限数量的互斥状态,例如:conditionA可能是num % 2 == 0而conditionB可能是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;否则,一个开关。在任何情况下,如果在这种情况下我都不会写其他内容。

将else添加为空的catch-errors块

这与上面的场景#2直接相关。除非可能的状态是有限的并且在编译时已知,否则您不能说“在任何其他情况下”意味着发生了错误。在方案#2中看到一个开关会感觉更自然,我觉得以这种方式使用其他方式会产生很难的代码味道。

使用带默认分支的开关。它会更清楚地传达你的意图:

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

这可能有点冗长,但读者可以清楚地知道代码是如何运作的。在我看来,一个空的其他区块看起来不自然而且令人费解。

答案 3 :(得分:2)

由于同样的原因,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变量的可靠性,无论我个人是否会添加它。

答案 4 :(得分:0)

elsedefault case语句的if。 如果没有else,则如果ifelse if个案例中的所有条件均未达到,则if语句将不执行任何操作。

通常最好有一个默认情况,但很多时候没有必要,因此被排除在代码之外。

在这种情况下,如果curScene不是1, 2, 3,那么将使用else声明,但由于在其他情况下没有处理,编码器已经不包括else

答案 5 :(得分:0)

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

至于它的不良做法我认为这取决于意图。如果没有明确定义最终的else子句,您最终可能会遇到一个错误,即您没有覆盖的条件会通过。考虑一下:

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

如果myVariable为0,则没有任何反应。很难看出你是否只是浏览代码。我会说,如果你遇到这种模式,那将是一种代码味道,可能是错误的,但它可能没问题。

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

答案 6 :(得分:-2)

是的,总是有一个其他 非常好的习惯(当使用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.
}

告诉别人在别的地方确实无事可做。

答案 7 :(得分:-4)

如果(answer == 100)if(answer === 100),则将答案验证的if条件更改 现在工作正常......