Object.assign() 不会自动跳过或替换 null 值,需预处理源对象;常见策略包括映射清洗、解构默认值或封装清洗函数,但仅限浅层,深层 null 需递归处理或统一标准化。

Object.assign() 本身不会自动跳过或替换 null 值,它会原样拷贝所有可枚举属性(包括 null)。要实现“对原始对象中 null 值的自动化清洗拷贝”,需结合其他逻辑预处理数据,不能仅靠 Object.assign() 单独完成。
理解 Object.assign() 的行为局限
Object.assign(target, ...sources) 是浅拷贝,只遍历源对象自身可枚举属性,且:
- 遇到
null或undefined源对象时直接报错(TypeError) - 若某个属性值为
null,该null会被完整复制到目标对象中 - 它不递归、不校验、不转换——没有内置清洗能力
清洗 null 的常见策略(配合 Object.assign 使用)
真正可行的方式是:先对源对象做预处理(把 null 替换为默认值或剔除),再用 Object.assign() 拷贝。常用方法有:
-
映射清洗后拷贝:用
Object.keys(obj).reduce()构建新对象,对每个值判断是否为null,替换成undefined或空字符串等 -
解构 + 默认值:适用于已知结构的对象,如
{ name: src.name ?? '', age: src.age ?? 0 } -
封装清洗函数:写一个通用工具函数,内部遍历属性,过滤/替换
null,再返回清洗后对象供Object.assign()使用
一个实用的清洗拷贝函数示例
以下函数将源对象中所有 null 值替换为 undefined(这样后续使用时可被默认值逻辑捕获),再执行拷贝:
function cleanNullAndAssign(target, source) {
if (source == null) return target;
const cleaned = {};
for (const key of Object.keys(source)) {
cleaned[key] = source[key] === null ? undefined : source[key];
}
return Object.assign(target, cleaned);
}
// 使用示例
const original = { name: 'Alice', age: null, city: null, score: 95 };
const result = cleanNullAndAssign({}, original);
// → { name: 'Alice', age: undefined, city: undefined, score: 95 }
注意深层 null 的处理边界
上述方法仅清洗第一层属性。如果原始对象嵌套了对象或数组(例如 { user: { profile: null } }),Object.assign() 和简单遍历都无法自动深入清洗。此时需要:
- 改用深克隆+递归清洗(如 Lodash 的
cloneDeepWith) - 或明确业务场景,只清洗关键字段,避免过度通用化
- 在 API 层或数据接入层统一做标准化(比在每次拷贝时清洗更可靠)

















