在JavaScript中使用'return'而不是'else'
我正在研究一个需要一些非常复杂的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...
}
我总是用第一种方法去。更容易阅读,缩减更少。就执行速度而言,这取决于实施,但我希望它们都是相同的。
自己测试一下。如果此JavaScript正在浏览器中运行,那么它几乎肯定取决于浏览器的JavaScript解析引擎。
我的理解是,这不会有什么区别,因为你用if条件分支。所以,如果some_condition是真的,那么即使没有返回,else部分也不会被触及。
您是否有号码来确认此声明?请记住,JavaScript通常不会被编译。 – 2009-11-30 16:32:27
性能不会有任何差异我会推荐第二个可维护性示例。一般而言,最好有一个且只有一个可能的出口点作为例程。它有助于调试和理解。
“个人资料,不要推测!”
- 你把本末倒置(可维护性人类胜过机器速度)
-
你应该测量,这意味着
- 你应该时,驱动器的优化工作自己执行;它会在不同的浏览器和版本
- 你应该只优化速度热点应用程序的明显不同(见点1)
可能略有下降,但我不认为它将是可衡量的,除非该函数的其余部分涉及“重”(否则,因为我认为回报会给出相同的结果)js调用。作为一个方面说明,我认为这是不必要的微型优化,你可能应该到其他地方寻求性能改进,即通过Chrome的开发人员工具或Firebug for Firefox(或类似工具)来分析脚本,并寻找慢/长运行调用/函数。
虽然它取决于正在运行的浏览器的JavaScript实现,但它们之间不应有任何显着差异(就速度而言)。
第二种形式是可取的,因为打破流动不是一个好的编程习惯。在装配中也要考虑到,无论评估如何,跳转指令(微操作)都会被评估。
需要引用(“不是一个好的编程习惯”)! :-)这是一个意见问题,是否最好嵌套如果else或提前返回;没有明确的赢家,就像制表符vs空格,vi和emacs等。我个人认为它*更好地提前返回(如第一种形式),但我认识到意见会有所不同。 – 2009-11-30 17:10:57
你说得对,“没有明确的赢家”,但它远非“vi”与“emacs”;它更像是“循环中断”vs“while循环”或“继续while/for循环”vs“外部if块”。我总是喜欢第二个。 – 2009-11-30 17:41:22
假设return
需要1ms,而嵌套if
需要0.1ms(反之亦然)。
很难想象任何一个人的速度都差不多。
现在,你是否每秒钟做100次以上?
如果是这样,也许你应该关心。
是的,它被称为很多次。否则,我知道它几乎没有区别! – jeffreyveon 2009-12-01 10:01:06
我会在排除无效情况时使用第一种方法。
例如,做一些验证时使用第一种方法,如果任何验证失败则返回。如果任何前提条件失败,进一步行动就毫无意义。 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
}
当有只有一个if..else
the performance is almost the same并不要紧。在你的案例中使用最好的可读性。但使用return
来嵌套报表是most performant与if...else
和case switch
从我的经验谈起,这取决于您检查的条件。
if .. return
是罚款和容易,如果你查了一些布尔条件(也许设置),这将使整个下面的代码不需要在所有执行读取。if .. else
如果您希望某个值是两个(或更多)可能值中的任意一个值,并且您希望为这两种情况执行不同的代码,则读取起来要容易得多。意味着两个可能的值代表相同的可解释价值的条件,因此应写在同一逻辑层次上。
在我看来,回报率和其它相同针对上述案例,但总体if-else
和if()return;
有很大的不同。如果您想从当前范围移至父范围,则可以使用return语句,但在if-else
的情况下,您可以在同一范围内检查更多if-else。
我不同意。也许有点容易阅读,但更难以维护,当它不是你而是更难时,而是更需要了解代码的其他开发者。一般来说,这是我的观点,即关于具有太多“返回”点的函数。 – 2009-11-30 16:35:41
我恭敬地不同意你的不同意见。根据我的经验,使用这种类型的构造从未影响可维护性。如果有的话,它已经变得更好;嵌套语句的数量越少,往往会增加我的可维护性。不过,我确实同意你的评论有太多的“回归点”。通常,我只在函数的开始和结束处有返回点。开始时明显的例外,并最终达到功能目的。 – 2009-11-30 17:28:21
双方都有优点。我个人的经验是,太多的嵌套if-elses是一场噩梦 - 尤其是如果其中一个条件非常短,所以我们可以使用return语句来快速终止它。这绝对使它更具可读性。 – jeffreyveon 2009-12-01 10:00:16