Javascript elseif / if else需要帮助

时间:2016-06-03 17:54:37

标签: javascript if-statement

我对编码很陌生,而且我从未理解做以下事情的正确方法:

if (something == true) {
    DoSomething();
} else {
    if (something2 == true) {
        DoSomething2();
    }
    DoSomethingAnyways();
}

我听说使用else if是正确的方法,但如果我使用DoSomethingAnyways();,如何执行else if

基本上我要问的是,如果使用其他的话,我该如何写这个呢?并且有相同的效果?

if (something == true) {
    DoSomething();
} else if (something2 == true) {
    DoSomething2();
    DoSomethingAnyways(); //<-- Where do I put this line of code?
}

6 个答案:

答案 0 :(得分:3)

假设你想要

  • DoSomething(),如果&#34;某事&#34;是的,
  • DoSomething2()如果&#34; something2&#34;是真的,但&#34;东西&#34;不是,
  • DoSomethingAnyways()如果&#34;某事&#34;是的,不管&#34; something2&#34;

然后你的代码就可以了。

if (something == true) {
    DoSomething();
} else {
    if (something2 == true) {
        DoSomething2();
    }
    DoSomethingAnyways();
}

使用&#34;否则如果&#34;

如果您不想使用嵌套ifs,您可以编写此代码,其效果与原始代码相同:

if (something == true) {
    DoSomething();
} else if (something2 == true) {
    DoSomething2();
    DoSomethingAnyways();
} else {
    DoSomethingAnyways();
}

然而,这在维护方面增加了复杂性。想象一下,在几个月内,您需要添加代码以在DoSomethingAnyways()之前执行操作。您可能需要维护两个分支 - &#34;否则如果&#34;和#34;其他&#34;分支 - 使您的代码变得越来越复杂。您可能会忘记更新一个分支,因为依赖关系不再明显 - 这会引入一个错误。

代码复杂性

嵌套ifs会使您的代码难以阅读 - 而且有一个指标:圈复杂度(通过代码的独立路径)。但是,在你的情况下,圈复杂度是相同的,无论你使用else-ifs还是else使用嵌套的if - 你有3个独立的路径。一般来说,一旦达到10,你应该考虑拆分你的代码,所以你仍然远离它。在这种情况下,圈复杂度很低,你的代码很容易掌握,所以我不担心。

我个人觉得你原来的代码&#34;更漂亮&#34;而不是else-if / else,因为它更好地描述了依赖关系(你调用&#34; DoSomethingAnyways()&#34;无论something2是否为真,但只有当某些东西是假的时你才会做整个DoSomething2 / DoSomethingAnyways)。

将else分支信息重构为函数

如果您担心嵌套ifs太多,请将else分支信息重构为一个新函数:

if (something == true) {
    DoSomething();
} else {
    DoSomething3(something2);
}

function DoSomething3(something2) {
    if (something2 == true) {
        DoSomething2();
    }
    DoSomethingAnyways();
}

调用函数的开销很小,所以我不会把它带到极端 - 使用你自己的判断。如果你认为&#34;哦,我想知道我是否仍然会在一年内得到这个&#34;,那么你应该减少复杂性(并记录你的工作,使用评论)。

无论哪种方式,你都可以使用else和嵌套的if或者函数 - 几个月内你会阅读的两个代码片段,并且可能仍然可以快速掌握依赖性,并且你不会运行在将来更改代码时忘记更新一个分支的风险。

答案 1 :(得分:1)

如果您希望DoSomethingAnyways()仅在DoSomething()没有触发时触发,而不关心DoSomething2()是否会触发,而不是像这样重写您的第一个示例:< / p>

if (something == true) {
    DoSomething();
} else if (something2 == true) {
    DoSomething2();
}

if(something != true){
    DoSomethingAnyways();
}

如果你依赖于真值,你也可以取出==!=并将其写成:

if (something) {
    DoSomething();
} else if (something2) {
    DoSomething2();
}

if(!something){
    DoSomethingAnyways();
}

答案 2 :(得分:1)

你做完这件事的方式并没有错。 else if适用于以下情况:

if (foo) {
  doSomething()
}
if (!foo && bar) {
  doSomethingElse()
}
if (!foo && !bar) {
  nothingWorked()
}

与此相同:

if (foo) {
  doSomething()
} else if (bar) {
  doSomethingElse()
} else {
  nothingWorked()
}

但是你的例子并不适合这种模式。

另见part of the jQuery source。不太相同,但相似。

答案 3 :(得分:0)

如果你想让DoSomethingAnyways()一直被解雇,你可以把它放在其他地方,如下:

if (something == true) {
    DoSomething();
} else if (something2 == true) {
    DoSomething2();

}
 DoSomethingAnyways();

答案 4 :(得分:0)

简短而简单的方法是将something2something的逻辑分开。

something ? DoSomething() : DoSomethingAnyway();

if (something2) {
  DoSomething2();
}

答案 5 :(得分:-1)

如果你只使用这些if else块 ,你可以像这样写(我认为这个解决方案更清晰):

void method() {
    if (something == true) {
        DoSomething();
        return;
    }

    if (something2 == true) {
        DoSomething2();
    }

    DoSomethingAnyways();
}

否则,如果你想让DoSomethingAnyways()真的运行,即使DoSomething2()抛出异常,它也可以写成try / finally块:

if (something == true) {
    DoSomething();
}

try {
    if (something2 == true) {
        DoSomething2();
    }
} finally {
    DoSomethingAnyways();
}

无论如何,我同意 gcampbell ,你的第一段代码听起来不错。