2017-04-27 69 views
1

找不到這個問題的更好的標題,所以編輯建議將不勝感激。分配變量條件與內聯條件檢查

我想知道是否有檢查條件與分配的變量和內聯條件之間的差異。
例如:

選項1:

// inline conditions check 
function isSomething(){ 
    return (1 > 2 || 'a' == 'a' || 2 < 4) || 
      (55 == 1 || (32 > 4 || 'a' == 'a') && 6 > 2) || 
      ('abc' != 'bca' && 3 == 3); 
} 

選項2:

// pre assigned variables condition check 
function isSomething(){ 
    const conditionA = 1 > 2 || 'a' == 'a' || 2 < 4; // some complex condition 
    const conditionB = 55 == 1 || (32 > 4 || 'a' == 'a') && 6 > 2; // some complex condition 
    const conditionC = 'abc' != 'bca' && 3 == 3 // some complex condition 

    const result = conditionA || conditionB || conditionC; 
    return result; 
} 

看來,在選項2,必須檢查所有3個條件,但在選項1理論上它可以在第一次檢查後返回,如果它是true

很明顯,選項2是我的選擇,因爲它更具可讀性,但我想知道行爲或性能有差異嗎? 有沒有辦法測試兩種選擇之間的性能?

+1

至於性能測試,如果你還沒有聽說過jsPerf的,這可能是最好的時刻訪問該網站。有多種替代方案,它們都在瀏覽器中聯機(例如http://jsben.ch/#/7XyeB)。 –

+0

@WiktorZychla有趣,謝謝我不知道這一點。雖然我有時會得到不同的結果。例如:代碼塊1最快,然後代碼塊2最快 –

回答

-1

至於檢查性能,我會看看jsperf

如果您還沒有看過,請看console.time(),console.profile()performance.now()

在選項2中,您正在創建3個新對象並將它們分配給變量,創建對象並將它們分配到內存中,這對性能的影響往往是微不足道的。

在選項1中,如果第一個值爲真,則第二個選項不會被評估爲||是短路操作員,而在第二個選項中,將評估所有三個條件,而不管它們返回的結果如何。

如果性能是一個問題,因爲這種方法被多次使用,我總是建議性能測試儘可能模擬真實世界的應用程序。

+0

*因爲您在兩個選項中進行相同的條件檢查*這是不正確的。正如OP自己指出的那樣,第一種情況將會短路,而第二種情況則不會。 – 2017-04-27 09:53:15

+0

@torazaburo我在第一個案例中看到,如果第一個條件是真的,其他條件將不會在第二個條件下運行,我會改變答案。 –

2

如果你想短路評價與可讀性的命名變量的好處,並結合,然後

function isSomething(){ 
    const conditionA =() => 1 > 2 || 'a' == 'a' || 2 < 4; 
    const conditionB =() => 55 == 1 || (32 > 4 || 'a' == 'a') && 6 > 2; 
    const conditionC =() => 'abc' != 'bca' && 3 == 3; 

    const result = conditionA() || conditionB() || conditionC(); 

    return result; 
} 
+0

林不知道這是資格作爲我的問題的確切答案,但這種解決方案是偉大的!沒有想過它,有點讓它「懶惰」的條件檢查。非常感謝。 –