登录
首页 >  文章 >  前端

Object.assign合并优先级详解

时间:2026-05-08 16:59:43 244浏览 收藏

Object.assign 的同名属性覆盖并非复杂算法,而是一条简单却常被误解的“后写入者胜出”赋值规则:参数按从左到右顺序依次拷贝,后出现的源对象中同名属性无条件覆盖先出现的(包括目标对象自身属性),且该优先级仅由传参位置决定,与对象类型、是否为空或内容无关;null 和 undefined 会被静默跳过但不干扰后续覆盖顺序,原始值因转为无自有属性的包装对象而等效于空操作,而嵌套对象则被整体替换而非深度合并——理解这一机制,是避免配置丢失、数据误覆和调试陷阱的关键。

如何理解 同名属性覆盖:在 Object.assign 多源合并过程中的优先级算法

同名属性覆盖不是“算法”,而是一条明确的赋值规则:按参数顺序,后出现的源对象中同名属性直接覆盖先出现的——包括目标对象自身已有的属性。

覆盖只看传参位置,不看对象类型或内容

Object.assign 的行为完全由调用时的参数顺序决定,和对象是配置、数据还是空对象无关。只要它出现在参数列表中靠后的位置,它的同名属性就拥有更高优先级。

  • 第一个参数(target)的同名属性会被第二个参数覆盖
  • 第二个参数的同名属性会被第三个参数覆盖
  • 以此类推,最后一个 source 拥有最终解释权

null 和 undefined 会被跳过,但不会打断顺序

如果某个 source 是 nullundefined,Object.assign 会安静地忽略它,继续处理下一个参数。这不会改变后续参数的覆盖优先级。

  • Object.assign({}, {a: 1}, null, {a: 2}){a: 2}
  • Object.assign({}, {a: 1}, undefined, {a: 3}){a: 3}

原始值(如字符串、数字)等效于空对象

传入字符串 'abc' 或数字 42 时,它们会被转为包装对象(new String('abc')new Number(42)),但这些包装对象没有可枚举自有属性,所以实际不拷贝任何东西,也不影响覆盖逻辑。

  • Object.assign({}, {x: 1}, 'hello', {x: 99}){x: 99}
  • 中间的字符串没起作用,但末尾对象仍按位置生效

浅合并意味着嵌套对象不被拆解

覆盖发生在第一层键上,嵌套对象被视为一个整体值。即使两个 source 都有 user: { name: 'A' },后者的整个 user 对象会替换前者,而不是合并内部字段。

  • Object.assign({}, {user: {name: 'Alice'}}, {user: {age: 30}}){user: {age: 30}}
  • user.name 消失了,因为 user 键被完整替换了

理论要掌握,实操不能落!以上关于《Object.assign合并优先级详解》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>