健壮的输入校验与分支拦截需分层防御:先守门式校验(类型/存在性检查),再规则驱动校验(可复用验证器),然后early return拦截异常,最后边界兜底(default分支、类型守卫、响应结构检查)。

健壮的输入校验与分支拦截,核心不是堆砌 if-else,而是分层防御:先做快速守门(类型/存在性检查),再做业务规则校验,最后用明确的分支拦截异常路径,避免逻辑坠入“else 深渊”。
守门式校验:用断言提前拦截明显非法输入
对函数入口参数做轻量、高确定性的检查,失败立即抛错或返回默认值,不进入后续逻辑。重点防 null、undefined、非预期类型:
- 用
typeof或Array.isArray()替代模糊的真值判断(如if (val)会误拦0、'') - 对必填字段,优先用严格相等检查:
if (name === undefined || name === null) - 数字校验别只靠
!isNaN(val),要结合typeof val === 'number' && isFinite(val)
规则驱动校验:把业务约束拆成可复用、可组合的验证器
避免校验逻辑散落在 if 分支里。封装成纯函数,每个只负责一条规则,支持链式调用或批量执行:
- 例如:
validateEmail(str)内部用正则 + 长度 + 去空格处理,返回{ valid: true, error?: string } - 组合多个规则:
const result = validateAll({ email: validateEmail, age: validateAgeRange }); - 错误信息统一结构,便于 UI 层消费,不直接 throw(除非是严重编程错误)
分支拦截:用 early return 替代嵌套 else,用 switch 处理离散状态
让正常流程保持在代码左侧,异常路径尽早退出。避免 “if 成功 → 执行;else → 一堆错误处理” 的反直觉结构:
立即学习“Java免费学习笔记(深入)”;
- 校验失败直接
return handleError(...)或throw new ValidationError(...),后续代码自然属于“已通过校验”上下文 - 对多状态分支(如请求响应码、表单步骤状态),优先用
switch,比一长串else if更清晰、更易维护 - 拦截后明确标注意图,比如
// 拦截:未登录用户禁止访问支付页,比空 else 更具可读性
边界兜底:默认分支 + 类型守卫增强 TypeScript 协同
即使有校验,也要为“理论上不该发生但 JS 运行时可能出错”的情况留余地:
-
switch必须带default,哪怕只是throw new Error(`Unreachable state: ${state}`) - 配合 TypeScript,在关键分支前加类型守卫函数(如
isUser(obj): obj is User),让类型系统帮你捕获漏判 - 异步操作中,
catch不仅处理网络错误,还要检查响应体结构是否符合预期(如data?.code !== 200)


















