Object.assign 是 JavaScript 中用于浅拷贝和合并对象的内置方法,它将一个或多个源对象的所有可枚举自身属性按顺序复制到目标对象并返回目标对象,但不处理原型属性、不可枚举属性及嵌套对象的深层合并。

Object.assign 是 JavaScript 中用于浅拷贝和合并对象的内置方法,它会把一个或多个源对象的所有可枚举自身属性复制到目标对象,并返回目标对象。
基本用法:合并两个或多个对象
语法:Object.assign(target, ...sources)
- target:目标对象(会被修改并作为返回值)
- ...sources:一个或多个源对象,属性按顺序从左到右覆盖
示例:
const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const obj3 = { c: 5, d: 6 };
const merged = Object.assign({}, obj1, obj2, obj3);
console.log(merged); // { a: 1, b: 3, c: 5, d: 6 }
注意:第一个参数传空对象 {} 是为了不修改原始对象;如果直接写 Object.assign(obj1, obj2),obj1 会被改变。
立即学习“Java免费学习笔记(深入)”;
处理同名属性:后出现的属性会覆盖前面的
当多个源对象有相同键时,靠后的对象中该键的值会覆盖前面的值。
- obj2 的
b: 3覆盖了 obj1 的b: 2 - obj3 的
c: 5覆盖了 obj2 的c: 4
只复制可枚举的自身属性
Object.assign 不会复制原型链上的属性,也不会复制不可枚举属性(如 Object.defineProperty 设置的 enumerable: false 属性)。
示例:
const parent = { x: 'from-parent' };
const child = Object.create(parent);
child.y = 'own';
Object.defineProperty(child, 'z', {
value: 'hidden',
enumerable: false
});
const copy = Object.assign({}, child);
console.log(copy); // { y: 'own' } —— x 和 z 都没被复制
不支持深拷贝,嵌套对象只是引用复制
这是关键限制:如果源对象里有嵌套对象,Object.assign 只复制引用,不是递归复制。
- 修改合并后对象中的嵌套属性,会影响原对象
- 需要深拷贝时,应使用结构化克隆(
structuredClone)、第三方库(如 Lodash 的_.merge),或手动递归实现
示例:
const a = { name: 'Alice', info: { age: 25 } };
const b = { info: { city: 'Beijing' } };
const merged = Object.assign({}, a, b);
console.log(merged.info); // { city: 'Beijing' } —— 整个 info 被替换了
// 但若想合并 info 内部,Object.assign 做不到:
// { info: { age: 25, city: 'Beijing' } } ← 这需要深合并


















