2009-11-30 65 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。

相關問題