object.assign() 实现浅拷贝并按参数顺序覆盖同名属性:后出现的源对象值覆盖先出现的,仅顶层键覆盖、不递归合并嵌套对象,推荐用空对象作目标以避免修改原对象。

Object.assign() 可以实现浅拷贝,同时天然支持属性覆盖:它按参数顺序依次将源对象的可枚举自有属性复制到目标对象,**后出现的同名属性会直接覆盖前面的值**。
覆盖规则很直接
Object.assign(target, ...sources) 中:
- 第一个参数是目标对象(会被修改)
- 后续每个源对象的属性,从左到右依次拷贝
- 遇到相同键名时,右边源对象的值会覆盖左边已存在的值
典型覆盖示例
比如想用配置 B 补充并覆盖配置 A:
const configB = { port: 8080, debug: true, timeout: 5000 };
const finalConfig = Object.assign({}, configA, configB);
结果:{ host: 'localhost', port: 8080, debug: true, timeout: 5000 }
→ port 和 debug 被 configB 覆盖,timeout 是新增属性。
注意:只覆盖一层,不递归
这是浅拷贝,嵌套对象不会被合并,而是整个引用被替换:
const a = { user: { name: 'Alice', age: 25 } };const b = { user: { name: 'Bob' } };
Object.assign({}, a, b); // → { user: { name: 'Bob' } }
a.user 整个被 b.user 替换,不是 { name: 'Bob', age: 25 } —— 深层属性不会“合并”,只会顶层键覆盖。
安全做法:总是传空对象作 target
避免意外修改原对象:
- ✅ 推荐:
Object.assign({}, obj1, obj2)—— 返回新对象 - ❌ 避免:
Object.assign(obj1, obj2)—— 直接修改 obj1











