Object.assign 是 JavaScript 中实现对象一层浅拷贝的常用方法,将源对象可枚举自有属性复制到目标对象并返回目标对象;仅第一层属性被复制,嵌套对象仍共享引用,且不拷贝原型链和不可枚举属性。

Object.assign 是 JavaScript 中实现对象一层浅拷贝最常用的方法之一,它会将一个或多个源对象的所有可枚举自有属性复制到目标对象,并返回目标对象。
基本用法:创建新对象作为目标
为避免修改原对象,通常传入一个空对象 {} 作为第一个参数(目标对象):
const copy = Object.assign({}, original);
此时 copy 和 original 是两个独立的对象,但注意:只有一层属性被“真正复制”,嵌套对象仍共享引用。
浅拷贝的关键特点:只复制第一层
以下情况能体现“一层”限制:
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
copy.a = 99不会影响original.a✅ -
copy.b.c = 99会同时改变original.b.c❌(因为b是引用类型,未被深拷贝) - 新增属性如
copy.d = 4不会影响原对象 ✅
常见误用与注意事项
避免直接把原对象当目标:
// ❌ 修改了原对象Object.assign(original, { a: 99 });
正确做法始终用新对象接收结果。另外注意:
- 只会拷贝 可枚举的自有属性(不包括原型链上的属性、不可枚举属性如
toString) - Symbol 类型的键也会被复制
- 如果源对象有 getter,Object.assign 会取其返回值,而非保留 getter 本身
替代写法(ES6+ 更简洁)
等价于展开运算符:
const copy = { ...original };两者都是一层浅拷贝,行为基本一致;展开运算符更简洁,但 Object.assign 支持动态多个源对象:

















