object.assign按参数顺序覆盖同名属性,后参数完全替换前参数的值;null/undefined被静默跳过;原始值转为空对象不拷贝;嵌套对象整体替换而非深度合并。

同名属性按参数顺序覆盖:后面的对象会直接替换前面同名的值,不合并、不跳过、不深处理。
覆盖只看传参位置,不看对象内容
Object.assign 的覆盖逻辑完全由调用时的参数顺序决定。谁排在后面,它的同名属性就生效:
- 第一个参数(target)的同名属性会被第二个参数覆盖
- 第二个参数的同名属性会被第三个参数覆盖
- 以此类推,最后一个 source 拥有最终决定权
null 和 undefined 会被安静跳过
它们不报错,也不参与赋值,但不会打乱后续参数的覆盖顺序:
- Object.assign({}, {a: 1}, null, {a: 2}) → {a: 2}
- Object.assign({}, {x: 'old'}, undefined, {x: 'new'}) → {x: 'new'}
原始值(如字符串、数字)等效于空对象
它们会被转成包装对象,但没有可枚举自有属性,所以不拷贝任何东西,也不影响覆盖流程:
- Object.assign({}, {y: 10}, 'hello', {y: 99}) → {y: 99}
- 中间的字符串没起作用,末尾对象仍按位置生效
嵌套对象是整体替换,不是深度合并
只在第一层 key 上比对和覆盖,内部结构不会被拆开合并:
- Object.assign({}, {user: {name: 'Alice'}}, {user: {age: 30}}) → {user: {age: 30}}
- 原来的 user.name 就丢失了,因为整个 user 值被替换成新对象











