【问题标题】:Correct way to write nested if statements?编写嵌套 if 语句的正确方法?
【发布时间】:2013-12-24 16:36:13
【问题描述】:

numberHands 将等于 1,2, or 3。如果没有,它永远不会在程序中走到这一步。所以我认为没有其他声明的理由。

但是,这是在 JavaScript 中编写嵌套 if 语句的正确语法吗?我觉得右括号不正确,但我是 js 新手。你会怎么写?

function recap() {
    if (numberHands > 0) {
        wonOrLost(h1.cards, h1);
    }
        if (numberHands > 1) {
            wonOrLost(h2.cards, h2);
        }
            if (numberHands > 2) {
                wonOrLost(h3.cards, h3);
            }
    playAgainOption();
}

【问题讨论】:

  • 在您的情况下,如果 numberHands 为 3,则所有三个语句都将执行,这是故意的吗?
  • 这可能是 switch 语句的更好情况。
  • 那些不是“嵌套的”if 语句。这是三个独立的if 语句的序列。
  • @MadaraUchiha 是的。如果 numberHands = 3 则所有 3 必须执行.. if = 1 则只是第 1 个,如果 2 则第 2 个但不是第 3 个
  • wonOrLost 代码是什么样的?一件好事是在该函数中考虑 numberOfHands。

标签: javascript nested-if


【解决方案1】:

你是对的,右括号在错误的位置。你要找的是

function recap() {
    if (numberHands > 0) {
        wonOrLost(h1.cards, h1);
        if (numberHands > 1) {
            wonOrLost(h2.cards, h2);
            if (numberHands > 2) {
                wonOrLost(h3.cards, h3);
            }
        }
    }
    playAgainOption();
}

注意

这在功能上与您当前拥有的相同。

【讨论】:

  • 确实,但 OP 询问的是嵌套语句。我正在展示嵌套语句的样子。
【解决方案2】:

试试这个...

function recap() {
    switch(numberHands) {
        case 3:
            wonOrLost(h3.cards, h3);
        case 2:
            wonOrLost(h2.cards, h2);
        case 1:
            wonOrLost(h1.cards, h1);
    }
    playAgainOption();
}

看起来这些函数的执行顺序并不重要,只要它们都被调用即可。对我来说,这种解决方案感觉更优雅。

祝你好运!

【讨论】:

  • 您需要查看 switch/case 语句的工作原理。该解决方案完全符合您的需要。在其中一种情况评估为真后,除非有中断,否则它将执行其后的每条语句。因为这个语句中没有break,所以在3计算为true之后,每个case都会在它之后执行。
【解决方案3】:

嗯,它不是嵌套的,但它仍然可以以相同的方式工作。那是因为

  • 如果是numberHands > 1,那么它的定义也是> 0
  • 如果是numberHands > 2,那么根据定义,它也是> 1> 0

嵌套 if 语句的正确语法是

if (condition) {
    doSomething();
    if (anotherCondition) {
        doSomethingElse();
        if (aThirdCondition) {
            doSomethingDifferent();
        }
    }
}

在您的情况下,您有几个独立的 if 语句,它们彼此不相关,除了如果一个为真,那么它后面的所有其他语句也为真。


如果 numberHands 等于 3 时你不打算让所有这些都运行,那么 switch/case 结构更合适,更可读: OP 澄清说他确实打算让它们全部运行。

switch (numberHands) {
    case 1:
        wonOrLost(h1.cards, h1);
        break;
    case 2:
        wonOrLost(h2.cards, h2);
        break;
    case 3:
        wonOrLost(h3.cards, h3);
        break;
}

【讨论】:

    【解决方案4】:

    这不是嵌套的if 语句,但如果您打算添加更多条件,它肯定是一种替代方法。

    var list = [h1,h2,h3];
    for (var i = 0; i < numberHands; i++) {
        wonOrLost(list[i].cards, list[i]);
    }
    

    【讨论】:

    • 这个答案虽然没有回答原始问题,但到目前为止是最好的,因为它教授了正确的建模。
    • 我不确定你的意思。如果 numberHands = 1,只有 list[0] 会被调用。
    • @linstantnoodles 对于一个新程序员(就像 OP 似乎是这样),这可能只是令人困惑,而且(恕我直言)它真的没有回答所问的问题!
    【解决方案5】:

    我不知道你是不是不习惯用markdown编辑器写,但那是不正确的缩进。

    function recap() {
        if (numberHands > 0) { // 1 or more
            wonOrLost(h1.cards, h1);
            if (numberHands > 1) {
                wonOrLost(h2.cards, h2); // 2 or more
            }
            if (numberHands > 2) {
                wonOrLost(h3.cards, h3); // 3 or more
            }
        }
        playAgainOption();
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-06
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 2012-06-22
      • 2011-12-15
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      相关资源
      最近更新 更多