2009-11-30 64 views
18

我正在研究一个需要一些非常复杂的JavaScript处理的项目。这在很多地方包括了很多嵌套的if - else。我一般都照顾通过读取堆栈 溢出的其它技巧来优化JavaScript代码尽可能的,但我想知道如果以下两个结构将使仅在速度方面有什么区别:在JavaScript中使用'return'而不​​是'else'

if(some_condition) { 
    // process 
    return ; 
} 

// Continue the else condition here 

VS

if(some_condition) { 
    // Process 
} 

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

回答

15

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

+8

我不同意。也许有点容易阅读,但更难以维护,当它不是你而是更难时,而是更需要了解代码的其他开发者。一般来说,这是我的观点,即关于具有太多“返回”点的函数。 – 2009-11-30 16:35:41

+8

我恭敬地不同意你的不同意见。根据我的经验,使用这种类型的构造从未影响可维护性。如果有的话,它已经变得更好;嵌套语句的数量越少,往往会增加我的可维护性。不过,我确实同意你的评论有太多的“回归点”。通常,我只在函数的开始和结束处有返回点。开始时明显的例外,并最终达到功能目的。 – 2009-11-30 17:28:21

+6

双方都有优点。我个人的经验是,太多的嵌套if-elses是一场噩梦 - 尤其是如果其中一个条件非常短,所以我们可以使用return语句来快速终止它。这绝对使它更具可读性。 – jeffreyveon 2009-12-01 10:00:16

0

自己测试一下。如果此JavaScript正在浏览器中运行,那么它几乎肯定取决于浏览器的JavaScript解析引擎。

0

我的理解是,这不会有什么区别,因为你用if条件分支。所以,如果some_condition是真的,那么即使没有返回,else部分也不会被触及。

+1

您是否有号码来确认此声明?请记住,JavaScript通常不会被编译。 – 2009-11-30 16:32:27

2

性能不会有任何差异我会推荐第二个可维护性示例。一般而言,最好有一个且只有一个可能的出口点作为例程。它有助于调试和理解。

4

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

  1. 你把本末倒置(可维护性人类胜过机器速度)
  2. 你应该测量,这意味着

    • 你应该时,驱动器的优化工作自己执行;它会在不同的浏览器和版本
    • 你应该只优化速度热点应用程序的明显不同(见点1)
1

可能略有下降,但我不认为它将是可衡量的,除非该函数的其余部分涉及“重”(否则,因为我认为回报会给出相同的结果)js调用。作为一个方面说明,我认为这是不必要的微型优化,你可能应该到其他地方寻求性能改进,即通过Chrome的开发人员工具或Firebug for Firefox(或类似工具)来分析脚本,并寻找慢/长运行调用/函数。

1

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

第二种形式是可取的,因为打破流动不是一个好的编程习惯。在装配中也要考虑到,无论评估如何,跳转指令(微操作)都会被评估。

+2

需要引用(“不是一个好的编程习惯”)! :-)这是一个意见问题,是否最好嵌套如果else或提前返回;没有明确的赢家,就像制表符vs空格,vi和emacs等。我个人认为它*更好地提前返回(如第一种形式),但我认识到意见会有所不同。 – 2009-11-30 17:10:57

+0

你说得对,“没有明确的赢家”,但它远非“vi”与“emacs”;它更像是“循环中断”vs“while循环”或“继续while/for循环”vs“外部if块”。我总是喜欢第二个。 – 2009-11-30 17:41:22

0

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

很难想象任何一个人的速度都差不多。

现在,你是否每秒钟做100次以上?

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

+0

是的,它被称为很多次。否则,我知道它几乎没有区别! – jeffreyveon 2009-12-01 10:01:06

2

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

例如,做一些验证时使用第一种方法,如果任何验证失败则返回。如果任何前提条件失败,进一步行动就毫无意义。 Martin fowler在他的Refactoring书中提到了同样的事情。他称之为“用条款替换条件”。它确实可以使代码易于理解。

下面是一个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  
} 
0

从我的经验谈起,这取决于您检查的条件。

  1. if .. return是罚款和容易,如果你查了一些布尔条件(也许设置),这将使整个下面的代码不需要在所有执行读取。

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

0

在我看来,回报率和其它相同针对上述案例,但总体if-elseif()return;有很大的不同。如果您想从当前范围移至父范围,则可以使用return语句,但在if-else的情况下,您可以在同一范围内检查更多if-else。

相关问题