合併條件式的前提是條件彼此平行

一連串條件做同一件事時,把它們合併起來讀得更清楚:

// before
if (a) return 0
if (b) return 0
if (c) return 0
 
// after
const isZero = a || b || c
if (isZero) return 0

這招我很常用,但它有一個不會寫在書上的前提:

這些條件必須彼此平行(parallel)——沒有先後順序、也不互相依賴。

不平行的時候合併就會改變語意:

  • 短路求值:a 原本擋在前面,b 只在 a 為 false 時才被算到。合併之後求值順序雖然還是左到右,但只要你調整了順序或改成 && 混用,語意就變了
  • 有依賴:b 的正確性依賴 a 先成立(例如 a 是 null check),合併之後那個保護就不見了
  • 有 side effect:條件裡有函式呼叫時,合併會改變它被呼叫的次數與時機

處方

合併前稍微 dry run 一次,確認邏輯上真的等價;有測試覆蓋是更可靠的方式——讓測試替你確認語意沒變,而不是靠眼睛。

同一個前提也出現在 攤平巢狀條件有兩條路:guard clause 省求值,重複條件換平行 和 條件抽成變數還是 function,判準是求值時機與規模:只要條件有副作用或求值昂貴,這幾招的等價性就要重新檢查。