object.assign按参数从左到右覆盖,后参数同名键覆盖前参数值;null/undefined被跳过,原始值转为空对象不拷贝属性;仅浅拷贝,嵌套对象整体替换而非合并。

Object.assign 的覆盖顺序非常明确:按参数从左到右,后出现的源对象中同名键直接覆盖先出现的值;内存上不创建新引用,而是浅拷贝——嵌套对象仍共享同一内存地址。
覆盖顺序只取决于参数位置
不是看对象内容或类型,而是严格按调用时的传参顺序决定谁胜出:
- 第一个源对象的属性最先写入目标对象
- 第二个源对象中同名键会覆盖第一个的值
- 第三个继续覆盖前两个,依此类推
- 最后一个非 null/undefined 的源对象拥有最终解释权
null 和 undefined 被静默跳过,不影响顺序
它们不参与赋值,但不会打断后续参数的覆盖逻辑:
-
Object.assign({}, {x: 1}, null, {x: 99})→{x: 99} -
Object.assign({}, {y: 'a'}, undefined, {y: 'b'}, null, {y: 'c'})→{y: 'c'}
原始值(如字符串、数字)等效于空对象
它们会被转为包装对象,但没有可枚举自有属性,因此不拷贝任何东西:
-
Object.assign({}, {z: 10}, 'hello', {z: 20})→{z: 20} - 中间的字符串没起作用,但末尾对象仍按位置生效
内存表现是浅拷贝,嵌套对象不拆解
Object.assign 不递归处理,只复制第一层属性的引用:
- 如果多个源对象都有
user: { name: 'A' },后面整个user对象会替换前面的,不是合并字段 -
const a = { u: { x: 1 } }; const b = { u: { y: 2 } }; Object.assign({}, a, b)→{ u: { y: 2 } } - 原
u的x属性丢失,因为u键被整体替换成新对象,两者指向不同内存地址











