合併條件式的前提是條件彼此平行
一連串條件做同一件事時,把它們合併起來讀得更清楚:
// 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,判準是求值時機與規模:只要條件有副作用或求值昂貴,這幾招的等價性就要重新檢查。