Object.assign是JavaScript中用于对象属性复制的内置方法,属于ES6新增的Object对象静态方法,主要用来将一个或多个源对象的自身可枚举属性复制到目标对象,最终返回处理后的目标对象。它的核心逻辑是遍历源对象的所有可枚举自身属性,把这些属性依次赋值到目标对象上,如果目标对象已经存在同名属性,源对象的属性值会覆盖目标对象的原有值。

基本语法
Object.assign的语法格式如下:
// target是目标对象,sources是一个或多个源对象 Object.assign(target, ...sources)
其中target是接收属性的目标对象,sources是提供属性的源对象,可以有多个。方法执行后会返回修改后的target对象,因此我们可以直接使用返回的结果,也可以后续操作target。
常见使用场景
1. 合并多个对象
当需要把多个对象的属性合并到一个对象中时,Object.assign是非常便捷的选择:
const obj1 = { name: '张三', age: 20 };
const obj2 = { gender: '男', hobby: '篮球' };
const obj3 = { age: 21, city: '北京' };
// 合并三个对象,后面的源对象同名属性会覆盖前面的
const mergedObj = Object.assign({}, obj1, obj2, obj3);
console.log(mergedObj);
// 输出:{ name: '张三', age: 21, gender: '男', hobby: '篮球', city: '北京' }这里第一个参数传入空对象{}作为目标对象,避免修改原有的obj1、obj2、obj3,合并后的结果会存放在新的对象中。
2. 实现对象浅拷贝
如果不传入额外的源对象,只把需要拷贝的对象作为源对象,目标对象设为空对象,就可以实现对象的浅拷贝:
const originalObj = { a: 1, b: { c: 2 } };
const copiedObj = Object.assign({}, originalObj);
console.log(copiedObj); // 输出:{ a: 1, b: { c: 2 } }
// 修改拷贝对象的基本类型属性,不会影响原对象
copiedObj.a = 3;
console.log(originalObj.a); // 输出:1
// 修改拷贝对象的引用类型属性,会影响原对象
copiedObj.b.c = 4;
console.log(originalObj.b.c); // 输出:4可以看到Object.assign只能拷贝对象的自身可枚举属性,对于引用类型的属性,拷贝的是引用地址,因此属于浅拷贝,修改拷贝对象中的引用类型属性会影响原对象。
使用注意事项
- 只会复制可枚举自身属性:继承的属性、不可枚举的属性都不会被复制到目标对象中。
- 属性覆盖规则:如果多个源对象有同名属性,排在后面的源对象的属性会覆盖前面的。
- 异常容错:如果源对象中有
null或者undefined,会被忽略,不会报错,也不会复制任何属性。 - 访问器属性处理:如果源对象的属性是getter,那么复制到目标对象的是getter的返回值,而不是getter本身。
和扩展运算符的对比
对象扩展运算符{...obj}也能实现对象合并和浅拷贝,和Object.assign的作用类似,但有一些细微区别:
| 对比项 | Object.assign | 对象扩展运算符 |
|---|---|---|
| 语法简洁度 | 需要调用方法,传参相对繁琐 | 语法更简洁,直接展开对象 |
| 属性覆盖逻辑 | 后面的源对象属性覆盖前面的 | 后面的属性覆盖前面的,逻辑一致 |
| 兼容性 | ES6支持,部分旧环境需要polyfill | 同样是ES6特性,兼容性基本一致 |
实际开发中可以根据场景选择,简单的合并或拷贝用扩展运算符更直观,需要兼容更旧的环境或者需要明确调用方法逻辑时可以用Object.assign。
Object.assignJavaScript对象合并浅拷贝修改时间:2026-06-06 07:41:28