Object.assign首个参数不可为null或undefined,否则抛TypeError;应使用{}兜底、??操作符或展开语法替代以确保安全。

Object.assign 的第一个参数不能为 null 或 undefined,否则会直接抛出 TypeError: Cannot convert null to object。这不是“报错后如何处理”,而是必须在调用前避免传入非法值。
确保目标对象是可赋值的普通对象
最稳妥的做法是显式提供一个空对象作为第一个参数,而不是依赖可能为 null 的变量:
- ❌ 错误写法:
Object.assign(someObj, source1, source2)(当someObj为null时崩溃) - ✅ 正确写法:
Object.assign({}, someObj, source1, source2)(始终以新对象为起点) - 若需复用原对象逻辑,可先做安全判断:
Object.assign(someObj ?? {}, source1, source2)
使用空值合并操作符(??)或逻辑或(||)兜底
当 someObj 可能为 null 或 undefined,但你又希望“尽可能复用它”时,可用 ?? 提供默认值:
-
Object.assign(someObj ?? {}, { a: 1 }, { b: 2 })——someObj为null时自动用空对象替代 - ⚠️ 注意:
someObj || {}在someObj是false、0、''等 falsy 值时也会触发替换,语义不如??精准
提前校验并给出明确提示(适合开发调试)
在关键路径中,可加一层防御性检查,便于快速定位问题来源:
if (someObj == null) throw new Error('Object.assign target cannot be null or undefined')- 或更轻量:
const target = someObj != null ? someObj : {},再传入Object.assign(target, ...)
替代方案:用展开运算符(...)更简洁安全
如果只是合并多个对象生成新对象,推荐用对象展开语法,它天然跳过 null 和 undefined:
-
{ ...someObj, ...source1, ...source2 }—— 即使someObj是null,也不会报错,只会被忽略 - 注意:展开语法只适用于对象,不支持
Date、RegExp等特殊对象的浅拷贝,而Object.assign会尝试调用其toString;多数业务场景下展开语法已足够

















