object.assign 是 javascript 中用于对象属性合并与浅拷贝的内置方法,它将一个或多个源对象的可枚举自有属性复制到目标对象并返回该目标对象;同名属性后覆盖,不处理原型、不可枚举属性及嵌套对象深层合并。

Object.assign 是 JavaScript 中用于对象属性合并与浅拷贝的内置方法,它将一个或多个源对象的可枚举自有属性(不包括原型链上的属性)复制到目标对象,并返回目标对象。
基本用法:合并多个对象
语法为 Object.assign(target, ...sources)。第一个参数是目标对象,后续都是源对象。所有源对象的属性会按顺序依次拷贝到目标对象中,同名属性会被后出现的覆盖:
const target = { a: 1, b: 2 };
const source1 = { b: 3, c: 4 };
const source2 = { c: 5, d: 6 };
const result = Object.assign(target, source1, source2);
// target 和 result 都是 { a: 1, b: 3, c: 5, d: 6 }
实现浅拷贝:传入空对象作为目标
若想不修改原对象,仅生成新副本,应把空对象 {} 作为第一个参数:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
const original = { name: 'Alice', skills: ['JS', 'CSS'] };
const copy = Object.assign({}, original);
console.log(copy === original); // false
console.log(copy.skills === original.skills); // true ← 注意:这是浅拷贝,引用值未被复制
- 基础类型(string、number、boolean、null、undefined)会被真正复制
- 引用类型(Object、Array、Function)只复制其引用,不是深拷贝
- Symbol 类型的属性也会被复制(ES6+ 支持)
注意事项和常见陷阱
使用 Object.assign 时需留意以下几点:
- 它只会拷贝源对象自身的、可枚举的属性,不可枚举属性(如
Object.defineProperty设置的enumerable: false)和原型链上的属性不会被复制 - 如果源对象有 getter,Object.assign 会执行 getter 并取其返回值,而不是保留 getter 本身
- 不能拷贝 symbol 属性以外的私有字段(如 #field),也不能处理 Map、Set、Date、RegExp 等特殊对象,它们会被转为普通对象或丢失类型信息
- 遇到
null或undefined源对象时会跳过(不报错),但传入非对象值(如字符串、数字)会被强制转为包装对象再拷贝
替代方案提示
若需要深拷贝,Object.assign 不适用,应考虑:structuredClone()(现代环境)、第三方库(如 lodash 的 _.cloneDeep),或手动递归实现。对于简单结构合并,也可用展开运算符:{...obj1, ...obj2},行为与 Object.assign({}, obj1, obj2) 基本一致,且更简洁易读。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










