使用'return'代替'其他'在JavaScript
-
10-07-2019 - |
题
我工作上的一个项目,该项目需要一些非常复杂的JavaScript处理。这包括一个很大的嵌套 if
-else
s在不少地方。我有一般的照顾,以优化JavaScript code尽可能通过阅读其他的技巧堆溢出,但我想知道,如果下列两个结构将使任何差别条款的速度:
if(some_condition) {
// process
return ;
}
// Continue the else condition here
vs
if(some_condition) {
// Process
}
else {
// The 'else' condition...
}
解决方案
我总是选择第一种方法。更容易阅读,减少缩进。就执行速度而言,这将取决于实现,但我希望它们都是相同的。
其他提示
在许多语言中,反转if
语句以减少嵌套是一种常见做法或使用前置条件。
在代码中嵌套较少可以提高代码的可读性和可维护性。
"个人资料,不要猜测!"
- 你把车前马(维护人类的王牌机速)
你应该推动优化的努力, 测量, ,这意味着
- 你应该时间执行自己;它将明显不同,在不同的浏览器和版本
- 你应该只优化速度的 热点 你的应用程序(见第1点)
性能没有任何差异我会推荐第二个可维护性示例。一般来说,最好只有一个例程的退出点。它有助于调试和理解。
在排除无效情况时,我将使用第一种方法。
EG。在进行一些验证时使用第一种方法,如果任何验证失败则返回。如果任何先决条件失败,那就没有必要继续下去了。 Martin fowler在他的重构一书中提到了同样的事情。他称之为<!>“;用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
}
可能稍微,但我不认为它是可测量的,除非函数的其余部分涉及<!> quot; heavy <!> quot; (并且因为我假设返回会产生相同的结果,所以是多余的)js调用。
作为旁注,我认为这是不必要的微优化,您应该在其他地方寻找性能改进,即通过Chrome的开发人员工具或Firebug for Firefox(或类似工具)配置脚本并查找慢/长时间运行调用/功能。
虽然它取决于正在运行的浏览器的JavaScript实现,但它们之间应该没有任何显着差异(就速度而言)。
第二种形式是优选的,因为打破流程不是一个好的编程习惯。另外在组装时考虑一下,无论评估如何,总是评估跳转指令(微操作)。
自己测试一下。如果这个JavaScript在浏览器中运行,它几乎肯定取决于浏览器的JavaScript解析引擎。
我的理解是,因为你使用if条件进行分支,所以不会产生任何影响。因此,如果some_condition为true,则即使没有返回,也不会触及else部分。
假设return
需要1ms而不是嵌套if
需要0.1ms(反之亦然)。
很难想象其中任何一个几乎都那么慢。
现在,你每秒做的次数超过100次吗?
如果是这样,也许你应该关心。
根据我的经验,这取决于你正在检查的条件。
-
if .. return
如果你检查一些布尔条件(可能是设置)会使整个后面的代码根本无法执行,那么它很好并且易于阅读。
如果您希望某个值是两个(或更多)可能值中的任何一个并且您希望为这两种情况执行不同的代码,则 -
if .. else
更容易阅读。这意味着两个可能的值代表具有相同可解释值的条件,因此应该写在同一逻辑层面上。
醇>
在我看来,对于上述情况,返回和其他方面相同,但一般if-else
和if()return;
是非常不同的。当您想要从当前范围移动到父范围时,可以使用return语句,而在<=>的情况下,您可以在同一范围内检查if-else。