前端表單邏輯中常遇到「計算中間值需參與判斷但不直接顯示在頁面」、「多條件合併判斷」、「輸入值即時校驗與顯示分離」等場景。本文針對典型 `if` 判斷困惑,提供變數分離、邏輯簡化、DOM 操作解耦的最佳實踐方案。
// ❌ 錯誤示範:直接操作 DOM 值參與判斷,導致顯示與邏輯耦合
if (input.value <= 10000) {
input.value = 50; // 強制顯示 50,破壞用戶輸入
}
// ✅ 正確模式:JS 變數承載邏輯,DOM 僅負責顯示
let logicValue = 0; // 純邏輯計算變數
let displayValue = ''; // 面向用戶的顯示值
function calculate(inputVal) {
// 1. 純邏輯運算,不觸碰 DOM
if (inputVal <= 10000) {
logicValue = 50; // 中間值只存在 JS 變數中
} else if (inputVal <= 100000) {
logicValue = inputVal * 0.05;
} else {
logicValue = inputVal * 0.1;
}
// 2. 根據邏輯結果決定顯示內容 (可不同於邏輯值)
if (inputVal <= 10000) {
displayValue = '優惠價'; // 或空字串、特定提示
} else {
displayValue = logicValue.toFixed(2);
}
// 3. 統一更新 DOM (單一職責)
document.getElementById('resultInput').value = displayValue;
document.getElementById('hiddenLogic').value = logicValue; // 若需表單提交隱藏域
}
const rules = [
{ max: 10000, logic: 50, display: '優惠價' },
{ max: 100000, logic: v => v * 0.05, display: v => v.toFixed(2) },
{ max: Infinity, logic: v => v * 0.1, display: v => v.toFixed(2) }
];
const rule = rules.find(r => val <= r.max);
logicValue = typeof rule.logic === 'function' ? rule.logic(val) : rule.logic;
displayValue = typeof rule.display === 'function' ? rule.display(val) : rule.display;
若代碼中:
let inputVal = document.getElementById('input').value; // 字串 "5000"
if (inputVal <= 10000) { ... } // JS 隱式轉型為數字,成立
// 後續代碼未重新獲取 input.value
if (inputVal > 200000) { ... } // 仍用舊值 "5000",永遠不成立
修正:每次判斷前**重新獲取** `parseFloat(input.value)`,或封裝 `getInputVal()` 函式確保數據新鮮度。
掌握「邏輯層與視圖層分離」思想,`if` 判斷不再是纏繞的條件語句堆砌,而是清晰可維護的業務規則表達。