为什么Javascript `if..else if'not以'else'结尾
Why would Javascript `if...else if` not end with an `else`?
这是我使用的一个教程中的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语句来表达。我会选择可读性更强的。
else
是if
语句的default case
。如果不存在else
,则如果if
或else 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(它现在运行良好。。。
- 如何在ReactJS JSX中执行嵌套的if-else语句
- Javascript Return and if/else
- JavaScript if-else 速记错误
- 如何检查if/else语句中的随机条件
- 在javascript中创建数组,而不是if.else
- Javascript If else 只返回 TRUE 或只返回 FALSE
- jquery if else不返回警报消息
- 在Javascript中为if/else语句添加OR
- If Else Java Script HTML
- jQuery/Javascript foreach If/Else |如果为空(不执行任何操作)Else(显示forea
- 我应该如何应用if-else条件来向具有不同用户角色的人显示不同的菜单
- geoTest函数-创建if/else语句
- JavaScript中的温度转换器(IF ELSE条件)
- Jquery/Javascript使用IF/ELSE语句更改img SRC
- 编写if-else语句的更好方法
- 在if/else语句中显示DIV
- PHP If Else-隐藏按钮
- JavaScript if/else未按预期操作
- if/else运算符未更改
- 名称不能以''jquery-if-else条件中的字符