Object.assign是JavaScript中实现浅拷贝的常用方法,将源对象可枚举自有属性复制到目标对象并返回目标对象;它不拷贝原型属性、不可枚举属性,支持Symbol键,但无法处理循环引用或深拷贝嵌套对象。

Object.assign 是 JavaScript 中实现浅拷贝最常用的方法之一,它把一个或多个源对象的可枚举自有属性复制到目标对象,并返回目标对象。
基本用法:创建新对象并拷贝属性
为了避免污染原对象,通常将空对象 {} 作为第一个参数(目标对象):
const original = { a: 1, b: { c: 2 } };
const copy = Object.assign({}, original);
此时 copy 是 original 的浅拷贝:顶层属性值被复制,但嵌套对象仍共享引用。
注意:只拷贝可枚举的自有属性
- 不会拷贝原型链上的属性
- 不会拷贝不可枚举属性(如
Object.defineProperty设置的enumerable: false属性) - Symbol 类型的键也能被正确拷贝(ES2015+ 支持)
常见误区与限制
- 遇到
null或undefined源对象会报错,需提前过滤 - 数组也是对象,
Object.assign([], [1,2,3])会得到[1,2,3],但本质仍是浅拷贝——修改子项(如对象元素)会影响原数组 - 不能处理循环引用,会直接抛出错误
- 对 Date、RegExp 等特殊对象,只会拷贝其原始值(如
toString()结果),而非实例本身
替代写法(ES6+ 更简洁)
等价于展开运算符:const copy = { ...original };,行为一致,也属于浅拷贝。两者在多数场景下可互换,但 Object.assign 支持动态传入多个源对象:
立即学习“Java免费学习笔记(深入)”;
const a = { x: 1 };
const b = { y: 2 };
const c = { z: 3 };
const merged = Object.assign({}, a, b, c); // { x: 1, y: 2, z: 3 }


















