Object.assign 是 JavaScript 中用于对象浅拷贝和属性合并的内置方法,将一个或多个源对象的可枚举自有属性复制到目标对象并返回目标对象;它只进行第一层属性复制,嵌套对象仍共享引用,使用时应以空对象为目标以防修改原对象。

Object.assign 是 JavaScript 中用于对象浅拷贝和属性合并的内置方法,它把一个或多个源对象的所有可枚举自有属性复制到目标对象,并返回目标对象。
实现浅拷贝
浅拷贝只复制对象第一层属性,嵌套对象仍共享引用。要避免修改原对象,通常用空对象作为目标:
- 写法:
const copy = Object.assign({}, originalObj); - 注意:不能直接写
Object.assign(originalObj),否则会修改原对象 - 数组也能用,但本质是把数组当对象处理(索引作为属性名),不推荐用于数组拷贝
合并多个对象
Object.assign 支持多个源对象,属性按顺序覆盖(后出现的同名属性会覆盖前面的):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 写法:
const result = Object.assign({}, obj1, obj2, obj3); - obj1、obj2、obj3 中同名属性,以靠后的优先;例如 obj2 的
name会覆盖 obj1 的name - 如果目标对象本身有属性,也会被后续源对象的同名属性覆盖
浅拷贝的局限性
因为是浅拷贝,嵌套对象不会被递归复制:
立即学习“Java免费学习笔记(深入)”;
- 例如:
const a = { x: 1, y: { z: 2 } }; const b = Object.assign({}, a); - 此时修改
b.y.z = 3,a.y.z也会变成 3 - 需要深拷贝时,应考虑 JSON.parse(JSON.stringify())(简单场景)、structuredClone(现代环境)或第三方库如 lodash.cloneDeep
替代写法与注意事项
ES6+ 中常用展开运算符 {...obj} 替代 Object.assign 做浅拷贝,语义更清晰:
-
const copy = { ...originalObj };等价于Object.assign({}, originalObj) - 展开运算符同样只做浅拷贝,且不拷贝不可枚举属性、getter/setter、Symbol 属性
- Object.assign 会触发 setter(如果目标对象有对应 setter),而展开运算符不会

















