症状
遇到“JavaScript TypeError — 无法将 undefined 或 null 转为对象”时靠猜测只会浪费时间。请按证据排查:先复现症状,再执行针对性诊断,定位根因后修复,并用明确检查验证结果。
可观察到的症状包括:
- 在 Object.keys 处报 TypeError: Cannot convert undefined or null to object
- 展开可能缺失的配置时抛错
- 解构 null 的 API 响应失败
诊断
先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。
步骤 1
node -e "console.log(Object.keys(undefined))"
堆栈帧会指出收到了 null/undefined 的确切函数。
步骤 2
console.log(typeof config, config)
区分 undefined、null 还是原始值,决定采用何种默认。
常见诱因(按出现频率排序):
- 对 undefined 或 null 调用 Object.keys/values/entries
- 展开或解构的目标不是对象
- JSON.parse 返回 null 却被当作对象处理
根因
Object.keys 等静态方法要求参数能强制转为对象,而 undefined 与 null 不能,故抛 TypeError;展开与解构有相同要求。
修复
为输入提供默认值(config ?? {}),使用前校验,且未检查类型前不把解析值当对象。读取优先用可选链。
注意:静默默认成 {} 可能掩盖真正缺失的配置;走默认路径时应记录。
function summarize(config) {
const cfg = config ?? {}; // default before object ops
const keys = Object.keys(cfg);
const { retries = 3 } = cfg; // safe destructure
return { keys, retries };
}
const parsed = JSON.parse(text); // may be null
if (parsed && typeof parsed === 'object') {
console.log(Object.keys(parsed));
}
验证
用此前失败的输入重跑并确认不抛错;为 undefined、null 与合法对象补充测试。
修复后补充一条回归测试,复现原始症状,防止问题再次出现。
这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。