最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
JavaScript 中 Object.assign 合并对象时的深度属性行为
时间:2026-07-02 12:18:51 编辑:袖梨 来源:一聚教程网
Object.assign仅执行浅拷贝,不递归合并嵌套对象,同名嵌套属性会被整体替换而非字段叠加;引用类型仅复制地址,修改共享引用会影响原对象;undefined/null值会写入目标对象(null源被忽略);深度合并需借助structuredClone、lodash.merge或手写递归函数。
Object.assign 在合并对象时**不处理深度属性**,它只做一层浅拷贝——嵌套对象不会被递归合并,而是整个引用被替换。
嵌套对象会被整体覆盖,不是合并
如果多个源对象都有同名的嵌套对象属性(比如 api 或 user.profile),后出现的源对象会直接替换前一个,内部字段不会叠加。
- 例如:
{ api: { baseUrl: '/v1' } }和{ api: { timeout: 3000 } }合并后,结果是{ api: { timeout: 3000 } },baseUrl丢失 - 这不是“合并子属性”,而是“赋值整个对象引用”
所有引用类型都按地址复制
数组、日期、正则、普通对象等,只要出现在属性值位置,就只复制其内存地址,不创建副本。
-
const a = { list: [1, 2] }; const b = Object.assign({}, a); b.list.push(3);→a.list也变成[1, 2, 3] - 深层嵌套如
user.address.city的修改,会影响所有共享该引用的对象
没有自动跳过 undefined 或 null 值
如果某个源对象里某属性值是 undefined,它仍会写入目标对象,把对应字段设为 undefined;null 同理,但 null 作为整个源对象参数会被跳过。
立即学习“Java免费学习笔记(深入)”;
-
Object.assign({x: 1}, {x: undefined})→{x: undefined} -
Object.assign({x: 1}, null, {y: 2})→{x: 1, y: 2}(null源被忽略)
想实现深度合并?得另想办法
Object.assign 本身不提供深合并能力。需要时可:
- 用
structuredClone()(现代环境)先深克隆再合并 - 借助
lodash.merge(),它会递归合并嵌套结构 - 手写递归函数,控制合并逻辑(如跳过
undefined、保留默认值等)
相关文章
- 土豆兄弟手游好玩吗 土豆兄弟手游核心玩法与特色体验详解 07-03
- 笔趣漫画2026最新登录入口 - 在线免费阅读热门漫画 07-03
- goldwave如何清除最近的文件列表 07-03
- 黑色信标游戏简介 黑色信标战斗画面演示 07-03
- 黑色信标何时公测 黑色信标公测上线时间分享 07-03
- 黑色信标第三章宝箱位置 黑色信标第三章宝箱获取攻略 07-03