核心是提前拦截、明确意图、统一处理。使用可选链(?.)和空值合并(??)安全访问嵌套属性与设置默认值;函数参数显式校验,类型系统+eslint+测试在编码阶段暴露隐患。

核心是提前拦截、明确意图、统一处理,而不是等报错再补救。
用可选链(?.)和空值合并(??)简化安全访问
JavaScript 的 ?. 能在访问嵌套属性前自动检查中间值是否为 null 或 undefined,避免 TypeError;?? 则只在左侧为 null 或 undefined 时才返回右侧默认值(注意:它不会把 0、''、false 当作“空”)。
- 替代
obj && obj.user && obj.user.name→obj?.user?.name - 设置默认用户名:
const name = user?.profile?.displayName ?? 'Anonymous' - 调用可能不存在的方法:
logger?.debug?.('ready')
函数入参做显式校验,不依赖运行时抛错
把“是否允许 null/undefined”作为接口契约的一部分。该拒绝的就早拒绝,该接受的就明确定义行为。
完整的Galileo AI平台 TypeScript/JS SDK 参考,用于评估、观察和保护 GenAI 应用。适用于构建 Node.js 或 TypeScript 项目。
- 必要参数用类型系统(如 TypeScript)标记为非空,或手动检查:
if (id == null) throw new Error('id is required') - 可选参数明确默认行为:
function fetchUser(id, options = {}) { ... },而不是让调用方传undefined进去碰运气 - 避免“隐式转换”,比如用
id || 'default'可能误把 0 或 false 当成空
统一处理异步边界和外部数据源
API 响应、localStorage、DOM 查询等天然可能返回 null/undefined,不能假设它们“应该有值”。
- fetch 后检查
response.ok和data?.result,别直接解构const { items } = await res.json() - DOM 操作前加存在性判断:
const el = document.getElementById('main'); if (el) el.classList.add('loaded') - 第三方库返回值查文档——有些方法明确写 “returns null if not found”,那就得处理,不是 bug
用类型系统 + ESLint 在编码阶段暴露隐患
光靠经验容易漏,工具能帮你守住底线。
- TypeScript 开启
strictNullChecks,让string和string | null类型不兼容,强制你处理分支 - ESLint 插件如
eslint-plugin-no-null或@typescript-eslint/no-unnecessary-condition警告可疑的空值比较 - 单元测试覆盖 null/undefined 输入场景,比如
test('handles null input gracefully', () => { expect(fn(null)).toBe(null) })
不复杂但容易忽略:健壮不是写更多 try/catch,而是让 null/undefined 在进入业务逻辑前就被识别、转化或拒绝。










