必须用空对象作 target,因为 Object.assign 直接修改第一个参数;若传原始对象会污染它,而 Object.assign({}, a, b) 返回新对象且不改变 a、b,支持属性覆盖、跳过 null/undefined,但仅浅拷贝。

用 Object.assign 实现浅拷贝并合并多个对象,核心是把空对象 {} 作为第一个参数(即目标对象),再依次传入要合并的源对象。
为什么必须用空对象作 target
因为 Object.assign 会直接修改第一个参数所指的对象。如果不传空对象,原始对象就会被污染:
- 写成
Object.assign(a, b, c)→a被改,且返回值就是a - 写成
Object.assign({}, a, b, c)→a和b不变,返回一个新对象
合并多个对象的写法
语法统一为:Object.assign({}, obj1, obj2, obj3, ...)。属性按顺序覆盖,后出现的同名属性生效:
-
const result = Object.assign({}, {x: 1}, {y: 2}, {x: 99});→{x: 99, y: 2} - 源对象中含
null或undefined会被跳过,不报错 - 源对象是原始类型(如数字、字符串)会被自动转为包装对象,通常不产生属性
它只做单层浅拷贝
顶层属性值如果是基本类型(字符串、数字、布尔等),复制的是值;如果是对象或数组,复制的是引用地址:
const a = { p: 1, nested: { q: 2 } };const b = Object.assign({}, a);-
b.p = 99;→ 不影响a.p -
b.nested.q = 99;→a.nested.q也变成99
常见适用场景
适合配置合并、状态快照、props 透传前的简单组合等不需要深拷贝的场合:
- 组件默认配置 + 用户配置:
Object.assign({}, defaults, userConfig) - 环境变量覆盖:
Object.assign({}, base, isProd ? prodConfig : devConfig) - React 中更新部分 state:
Object.assign({}, prevState, { loading: false })











