我正在开发一个需要一些非常复杂的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...
}
答案 0 :(得分:17)
我总是选择第一种方法。更容易阅读,减少缩进。就执行速度而言,这将取决于实现,但我希望它们都是相同的。
答案 1 :(得分:5)
在许多语言中,invert if
statements to reduce nesting或使用preconditions是常见做法。
在代码中嵌套较少可以提高代码的可读性和可维护性。
答案 2 :(得分:3)
“个人资料,不要推测!”
您应该通过测量来推动您的优化工作,这意味着
答案 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 performant与if...else
和case switch
相比
答案 11 :(得分:0)
根据我的经验,这取决于你正在检查的条件。
if .. return
很好,如果你检查一些布尔条件(可能是设置)会使整个后面的代码不必执行就很容易阅读。
if .. else
如果您希望某个值是两个(或更多)可能的值中的任何一个并且您希望为这两种情况执行不同的代码,则更容易阅读。这意味着两个可能的值代表相同可解释值的条件,因此应该写在相同的逻辑级别上。
答案 12 :(得分:0)
在我看来,对于上述情况,return和else是相同的,但一般来说if-else
和if()return;
是非常不同的。如果要从当前范围移动到父范围,可以使用return语句,而在if-else
的情况下,可以在同一范围内检查if-else。