← 中文资源

简体中文版本

JavaScript TypeError — 无法将 undefined 或 null 转为对象

通过为输入提供默认值并在边界处校验,修复 Object.keys、展开或解构引发的“无法将 undefined 或 null 转为对象”。

阅读英文原文

症状

遇到“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 与合法对象补充测试。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。