Object.assign是ES6提供的浅拷贝与对象合并方法,只复制第一层可枚举自有属性,嵌套对象仅复制引用;同名属性后覆盖前,null/undefined源对象被忽略,推荐用空对象作target以防污染原数据。

Object.assign 是 ES6 提供的原生方法,专门用于浅拷贝和对象合并。它不创建深副本,只复制第一层属性,对嵌套对象或数组仅传递引用——这是理解其行为的关键。
基本用法:目标 + 多个源对象
调用格式为 Object.assign(target, source1, source2, ...):
- 第一个参数是目标对象(会被直接修改)
- 后续参数是源对象,按顺序依次拷贝自身可枚举属性
- 同名属性后出现的会覆盖先出现的(“后写入者胜”)
- null 或 undefined 作为源对象会被忽略,不会报错
例如:
const defaults = { theme: 'light', lang: 'zh' };
const userOpts = { theme: 'dark' };
const runtime = { debug: true };
const config = Object.assign({}, defaults, userOpts, runtime);
// → { theme: 'dark', lang: 'zh', debug: true }
为什么叫“浅拷贝”?关键在嵌套结构
如果源对象里有对象或数组,Object.assign 只复制其内存地址,不是内容本身:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 后果明显:修改合并后对象里的嵌套值,原始源对象也会跟着变
- 比如:
Object.assign({ a: { x: 1 } }, { a: { y: 2 } })结果是{ a: { y: 2 } },不是{ a: { x: 1, y: 2 } } - 数组同理:拷贝的是引用,push、pop 等操作会影响源数组
安全使用:避免污染原始数据
多数场景下你不希望改原始配置或状态对象,所以推荐:
立即学习“Java免费学习笔记(深入)”;
- 始终用空对象
{}或Object.create(null)作 target - 不要把已有业务对象直接当 target(除非你明确想修改它)
- 注意 Symbol 属性能被拷贝,但不可枚举属性(
enumerable: false)和原型链上的属性不会被复制
替代方案:展开运算符(...)更简洁,但有差异
ES6+ 中常用写法:
const config = { ...defaults, ...userOpts, ...runtime };
- 语义更清晰,也是浅拷贝
- 区别在于:展开运算符遇到
null或undefined会直接报错;Object.assign 则跳过它们 - 两者都不处理深层合并,需要深拷贝时应选用
structuredClone()、Lodashmerge()或手动递归

















