Object.assign 是 JavaScript 中实现对象浅拷贝的方法,只复制第一层可枚举自身属性,嵌套引用类型仍共享内存地址;语法为 Object.assign(target, ...sources),常以空对象为 target 避免污染原对象。

Object.assign 是 JavaScript 中实现对象浅拷贝的常用方法,它会将一个或多个源对象的所有可枚举自身属性复制到目标对象,并返回目标对象。
基本用法与浅拷贝本质
它只复制第一层属性,不会递归处理嵌套对象。也就是说,如果源对象某个属性值是引用类型(如对象、数组),目标对象中对应的属性仍指向同一内存地址。
- 语法:Object.assign(target, ...sources)
- target 会被修改并返回,通常传入空对象 {} 作为目标以避免污染原对象
- 只拷贝 可枚举的自有属性(不包括原型链上的属性、不可枚举属性、symbol 属性)
示例说明浅拷贝行为
看这个典型例子:
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = Object.assign({}, obj1);
obj2.a = 99;
obj2.b.c = 88;
console.log(obj1.a); // 1(基础类型不受影响)
console.log(obj1.b.c); // 88(引用类型被修改,原对象同步变化)
可见 b 属性是对象,obj2.b 和 obj1.b 指向同一个对象,因此修改 obj2.b.c 会影响 obj1。
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
注意事项和常见误区
- 不能拷贝不可枚举属性(如 Object.defineProperty 设置的 enumerable: false 属性)
- 不处理 symbol 类型的键(ES6 后可用 Reflect.ownKeys + 手动遍历支持)
- 遇到 null 或 undefined 源对象会跳过,但传入非对象(如字符串、数字)会先转为包装对象再拷贝其可枚举属性
- 不是深拷贝,需要深拷贝时应使用 structuredClone(现代环境)、JSON 序列化(无函数/undefined/循环引用限制)或第三方库如 lodash 的 cloneDeep
替代写法(ES6+ 更简洁)
对于简单浅拷贝,扩展运算符 ... 更直观:
const obj2 = { ...obj1 };
效果与 Object.assign({}, obj1) 基本一致(同样只浅拷贝、忽略不可枚举属性和 symbol 键),且更易读。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










