在JavaScript中使用'return'而不​​是'else'

时间:2009-11-30 16:26:37

标签: javascript optimization if-statement

我正在开发一个需要一些非常复杂的JavaScript处理的项目。这包括很多嵌套的if - else在很多地方。通过阅读Stack Overflow上的其他提示,我一般都会尽可能地优化JavaScript代码,但我想知道以下两个结构是否会在速度方面产生任何影响:

if(some_condition) {
    // process
    return ;
}

// Continue the else condition here

VS

if(some_condition) {
    // Process
}

else {
   // The 'else' condition...
}

13 个答案:

答案 0 :(得分:17)

我总是选择第一种方法。更容易阅读,减少缩进。就执行速度而言,这将取决于实现,但我希望它们都是相同的。

答案 1 :(得分:5)

在许多语言中,invert if statements to reduce nesting或使用preconditions是常见做法。

在代码中嵌套较少可以提高代码的可读性和可维护性。

答案 2 :(得分:3)

“个人资料,不要推测!”

  1. 你把马放在马前(人的可维护性胜过机器速度)
  2. 您应该通过测量来推动您的优化工作,这意味着

    • 你应该自己计划执行;它在不同的浏览器和版本中显然会有所不同
    • 您应该只针对应用程序的热点进行优化(参见第1点)

答案 3 :(得分:2)

性能没有任何差异我会推荐第二个可维护性示例。一般来说,最好只有一个例程的退出点。它有助于调试和理解。

答案 4 :(得分:2)

在排除无效情况时,我将使用第一种方法。

EG。在进行一些验证时使用第一种方法,如果任何验证失败则返回。如果任何先决条件失败,那就没有必要继续下去了。 Martin fowler在他的Refactoring书中提到了同样的事情。他称之为“用Guard条款取代条件”。它确实可以使代码易于理解。

这是一个java示例。

  public void debitAccount(Account account, BigDecimal amount) {
    if(account.user == getCurrentUser()) {
      if(account.balance > amount) {
           account.balance = account.balance - amount
       } else {
          //return or throw exception
       }
    } else {
        //return or throw exception
    }
  }

VS

 public void debitAccount(Account account, BigDecimal amount) {
    if(account.user != getCurrentUser()) return //or error
    if(account.balance < amount) return //or error
    account.balance = account.balance - amount    
}

答案 5 :(得分:1)

也许是轻微的,但我不认为它是可测量的,除非函数的其余部分涉及“重”(并且因为我假设返回会给出相同的结果,因此多余的)js调用。

作为旁注,我认为这是不必要的微优化,您应该在其他地方寻找性能改进,即通过Chrome的开发人员工具或Firebug for Firefox(或类似工具)配置脚本并查找慢/长时间运行调用/功能。

答案 6 :(得分:1)

虽然它取决于正在运行的浏览器的JavaScript实现,但它们之间应该没有任何显着差异(就速度而言)。

第二种形式是优选的,因为打破流程不是一个好的编程习惯。另外在组装时考虑一下,无论评估如何,总是评估跳转指令(微操作)。

答案 7 :(得分:0)

自己测试一下。如果这个JavaScript在浏览器中运行,它几乎肯定会依赖于浏览器的JavaScript解析引擎。

答案 8 :(得分:0)

我的理解是,因为你使用if条件进行分支,所以不会产生任何影响。因此,如果some_condition为true,则即使没有返回,也不会触及else部分。

答案 9 :(得分:0)

假设return需要1ms而嵌套if需要0.1ms(反之亦然)。

很难想象其中任何一个几乎都那么慢。

现在,你每秒做的次数超过100次吗?

如果是这样,也许你应该关心。

答案 10 :(得分:0)

如果只有一个if..else the performance is almost the same并且无关紧要。使用在您的情况下最好的可读性。但使用return来嵌套语句的是most performantif...elsecase switch相比

答案 11 :(得分:0)

根据我的经验,这取决于你正在检查的条件。

  1. if .. return很好,如果你检查一些布尔条件(可能是设置)会使整个后面的代码不必执行就很容易阅读。

  2. if .. else如果您希望某个值是两个(或更多)可能的值中的任何一个并且您希望为这两种情况执行不同的代码,则更容易阅读。这意味着两个可能的值代表相同可解释值的条件,因此应该写在相同的逻辑级别上。

答案 12 :(得分:0)

在我看来,对于上述情况,return和else是相同的,但一般来说if-elseif()return;是非常不同的。如果要从当前范围移动到父范围,可以使用return语句,而在if-else的情况下,可以在同一范围内检查if-else。