Object.assign 是 JavaScript 中实现对象浅拷贝的常用方法,仅复制可枚举自身属性且只拷贝一层,嵌套对象仍共享引用;它不处理原型属性、不可枚举属性、Symbol 属性,且会触发 getter;深拷贝需用 structuredClone、JSON 方法或第三方库。

Object.assign 是 JavaScript 中实现对象浅拷贝最常用的方法之一,它会将一个或多个源对象的所有可枚举自身属性复制到目标对象,并返回目标对象。
基本用法:创建新对象进行拷贝
为避免修改原对象,通常把空对象 {} 作为第一个参数(目标对象):
const original = { a: 1, b: { c: 2 } };
const copy = Object.assign({}, original);
此时 copy 和 original 的顶层属性互不影响,但嵌套对象仍共享引用。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
浅拷贝的局限性:嵌套对象不被递归复制
Object.assign 只做一层拷贝,对嵌套对象、数组等引用类型,只复制其引用地址:
立即学习“Java免费学习笔记(深入)”;
-
copy.a = 99→ 不影响original.a(基础类型独立) -
copy.b.c = 99→original.b.c也会变成 99(引用同一对象)
常见误用与注意事项
- 不要用已有对象作目标:如
Object.assign(original, {...})会直接修改原对象 - 仅拷贝可枚举的自身属性(不包括原型链上的属性、不可枚举属性、symbol 属性)
- 如果源对象有 getter,赋值时会触发 getter 并取其返回值,而非保留 getter 本身
替代方案提示(按需选择)
若需深拷贝,不能依赖 Object.assign,可考虑:
- 结构化克隆(现代环境):
structuredClone(obj) - JSON 序列化(仅适用于纯数据,不含函数、undefined、Date 等):
JSON.parse(JSON.stringify(obj)) - 第三方库如 Lodash 的
_.cloneDeep()

















