【问题标题】:Do I need a last `else` clause in an `if...else if` statement? [duplicate]`if...else if` 语句中是否需要最后一个 `else` 子句? [复制]
【发布时间】:2022-02-09 18:36:43
【问题描述】:

我见过的每个if...else if 示例都包含一个最终的else 子句:

if (condition1) {
  doA();
} else if (condition2) {
  doB();
} else if (condition3) {
  doC();
} else {
  noConditionsMet();
}
alwaysDoThis();

我知道这基本上是嵌套 if...else 语句的语法糖:

if (condition1) {
  doA();
} else {
  if (condition2) {
    doB();
  } else {
    if (condition3) {
      doC();
    } else {
      noConditionsMet();
    }
  }
}
alwaysDoThis();

我从未见过任何if...else if 示例省略了最后一个else 子句。但是看到普通的if 语句(没有else 子句)是有效的,并且按照上面等效的“嵌套语句”,我的直觉告诉我可以这样做:

if (condition1) {
  doA();
} else if (condition2) {
  doB();
} else if (condition3) {
  doC();
}
alwaysDoThis();

谁能给我指出一个明确说明它是否有效的资源或示例?

在另一个层面上,如果它有效的,它会被推荐还是被认为是“不好的做法”?

【问题讨论】:

  • 流量控制存在让您决定如何控制流量。当然,您可以通过运行代码并查看它的执行来确定它是否“有效”。
  • 这取决于上下文。您应该始终考虑else 的情况,但通常您不需要明确地处理它。但是,我认为必要性的可能性随着案件的数量而增加。这符合您的说法,即在更大的条件级联中省略 else 子句是不寻常的。
  • 感谢您对我的回答进行编辑;我学了一个new word

标签: javascript if-statement conditional


【解决方案1】:

就 JavaScript 而言,结尾 else 不是强制性的。至于是否需要,就看你想达到什么目的了。

当指定条件都不为真时,将执行结尾的else 子句。如果条件是collectively exhaustive,那么else 子句完全是多余的,除非它可能包含一个捕获“不可能”条件的断言。在您的情况下,您是否需要 else 子句取决于您是否希望特定代码在且仅当 condition1condition2condition3 都不为真时运行。

else 可以省略 any if 语句,if/else if 链的最后一个 if 没有什么特别之处。这在任何 JavaScript 语法中都有记录,例如在the specification

【讨论】:

  • 没问题!我明白你的意思,但我想更正记录。你是对的,你的条件应该互斥,以实现良好的编码(即使它不是强制性的)。但是最终的else 子句是否会运行并不要求您的条件是互斥的;它要求它们全面详尽。查看 MECE 原则 了解更多信息。
  • @chharvey 是的,总的来说,详尽无遗完全符合我想要传达的内容 - 如果我知道这个词,我会使用它。使用“互斥”代替它是一种有效的方法,因为它是一个更强的标准,因此它不会使句子的其余部分无效 - 但集体详尽地涵盖了它,既不会太严格也不会太宽容。
【解决方案2】:

100% 有效。不,这不是坏习惯。如果你不需要它,就不要写它。

以以下为例:

function doStuff(data) {
    if (data.something) {
        // go format the data in some way
    }
    else if (data.somethingElse) {
        // go format the data in some other way
    }
    // must be formatted correctly, don't do anything else
    ...
}

【讨论】:

  • 谢谢,伙计!我在想我做错了什么,没有添加最后一个 else。
【解决方案3】:

您永远需要 else 子句。 (很难提供一些不必要的例子,所以我就这样吧。)

edit 作为注释说明,语言语法符号中的方括号通常表示某些东西是可选的。

【讨论】:

  • 我是这么想的,但我还没有看到任何官方文档。即使MDN's docs 总是有一个最终的else 子句。
  • 但是,请注意,这不会扩展到三元条件运算符:a ? b : c 永远不会变成 a ? b(但 a && b 具有您所期望的语义)。跨度>
  • @chharvey:来自您链接的文档:"statement2 如果条件评估为 false 并且存在 else 子句,则执行的语句。" 他们'告诉你else 子句可能不存在。语法还在[else statement2] 周围显示方括号,这通常表示可选的内容。
  • 是的,我看到了方括号,我知道else 在普通的if 语句中是可选的;我只是想在if..else if 声明中确认它是可选的。
  • @chharvey:JavaScript 没有 else if 语句。在您链接的文档中也多次提到了这一点。它只有if (expression) statement else statement。因为if 语句是一个语句(显然),你可以在else 之后使用它,就像任何其他语句一样,如for 或空;switch 或任何任意表达式语句。
【解决方案4】:

不需要 else 块,它们不是 if else 语句而是 if 语句。考虑 else,elseif 作为扩展。

这是指向站点主题线程的链接:click this。 和 * 上的一个类似线程:click here

【讨论】:

  • 谢谢,虽然原理一样,但这个问题是关于Javascript,而不是PHP
  • oups,错误的部分 ;)
最近更新 更多