以下是我正在使用的教程中的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);
}
}
答案 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)
else
是default case
语句的if
。
如果没有else
,则如果if
或else 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条件更改 现在工作正常......