卫语句的核心是用提前返回或抛出错误快速处理异常情况,使主逻辑保持左对齐、清晰易读;应独立、单一、正向可读,集中置于函数开头,按存在性→类型→业务有效性→权限顺序校验。

卫语句(Guard Clauses)的核心是:用提前返回(或抛出错误)快速处理异常、边界或无效情况,把主逻辑“缩进一层”,留在更清晰、更靠左的代码区域。写得好,代码读起来像自然语言——先排除“不行的”,再专注“行的”。
用独立条件 + 早退,避免深层嵌套
别把正常流程包在 if-else 里层层缩进。每个 Guard 应该职责单一、语义明确,条件为真时立刻退出当前作用域。
- ✅ 好: if (!user) return null; —— 简洁、无副作用、意图直白
- ❌ 避免:if (user) { ... } else { return null; } —— 主逻辑被裹在 if 里,多一层缩进
- 多个守卫可连续排列,无需 else:先检查是否为空,再检查权限,再检查状态,每条都独立生效
条件表达式要“正向可读”,别绕弯
Guard 的判断条件应让人一眼看懂“什么情况下该拦住”。优先使用肯定形式,避免双重否定或复杂取反。
- ✅ 推荐:if (items.length === 0) return [];(空就返空数组)
- ⚠️ 谨慎:if (!(items && items.length > 0)) return [];(逻辑缠绕,易漏判)
- 必要时拆解并命名中间变量:const hasRequiredFields = user.name && user.email;,再 if (!hasRequiredFields) throw new Error(...);
统一错误类型与提示,便于调试和捕获
Guard 不只是 return,也常 throw。保持错误风格一致,让调用方容易识别是参数问题、权限问题还是业务约束失败。
- 对无效输入用 throw new TypeError('name must be a string');
- 对业务规则违反用 throw new Error('user is suspended');
- 避免裸 throw 字符串:throw 'Invalid id'; —— 不利于 instanceof 判断和工具链分析
函数入口处集中放置,形成“校验门禁”
把所有 Guard 放在函数最开头,不穿插在计算逻辑中。这样读者扫一眼就能掌握前置要求,不用往下翻才明白“原来这里不能传 null”。
- 顺序建议:参数存在性 → 类型检查 → 业务有效性(如 status !== 'draft')→ 权限/依赖就绪
- 示例:
function processOrder(order, paymentService) { if (!order) throw new TypeError('order is required'); if (typeof order !== 'object') throw new TypeError('order must be an object'); if (!order.id) throw new Error('order.id is missing'); if (order.status !== 'pending') throw new Error('only pending orders can be processed'); if (!paymentService?.charge) throw new TypeError('paymentService invalid'); // ✅ 主流程现在干净、靠左、无干扰 return paymentService.charge(order.amount); }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











