object.assign()是es6提供的用于浅拷贝和对象合并的原生方法,将源对象可枚举自有属性复制到目标对象并返回目标对象;它不处理原型、不可枚举属性、symbol键,嵌套对象仅复制引用,同名属性后写入者覆盖前者。

Object.assign() 是 ES6 提供的原生方法,用于将一个或多个源对象的可枚举自有属性(不包括继承属性、不可枚举属性、Symbol 属性)复制到目标对象上,并返回目标对象。它天然支持浅拷贝和属性混合(即“合并”或“扩展”),但需注意其行为特点。
实现对象的浅拷贝
浅拷贝指只复制对象第一层属性,嵌套对象仍共享引用。使用 Object.assign() 时,把空对象作为第一个参数(目标对象),待拷贝对象作为源对象即可:
- ⚠️ 注意:不能直接传入原始对象本身作目标,否则会污染原对象
- 正确写法:
const copy = Object.assign({}, originalObj); - 如果原对象有嵌套对象,修改
copy.nested.name会影响originalObj.nested.name
实现多对象属性混合(合并)
多个源对象的属性会按顺序依次拷贝到目标对象中,后出现的同名属性会覆盖前面的:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 语法:
Object.assign(target, source1, source2, ...) - 例如:
const merged = Object.assign({}, {a: 1, b: 2}, {b: 3, c: 4});→{a: 1, b: 3, c: 4} - 常用于配置项默认值处理:
const config = Object.assign({timeout: 5000}, userConfig);
注意事项与常见陷阱
Object.assign() 不是万能工具,实际使用中需留意以下几点:
- 只拷贝可枚举的自有属性(
for...in能遍历到的),不处理__proto__、getters/setters或不可枚举属性 - 无法深拷贝:数组、日期、正则、函数等特殊类型会被原样赋值(函数可拷贝,但闭包环境不变)
- Symbol 类型的键不会被
Object.assign()拷贝(ES2015+ 中已支持,但早期 polyfill 可能不兼容) - 如果源对象为
null或undefined,会跳过;但若目标对象为null或undefined,会抛出 TypeError
替代方案参考(当需要深拷贝或更健壮合并时)
对于深层结构或复杂场景,可考虑:
- 深拷贝:用
JSON.parse(JSON.stringify(obj))(仅限纯数据,不支持函数/undefined/Date 等) - 现代替代:
structuredClone()(Chrome 98+,支持更多类型,但兼容性有限) - 库方案:Lodash 的
_.assignIn()(含继承属性)、_.merge()(深合并) - 解构赋值:
const merged = {...obj1, ...obj2};(语法更简洁,行为类似Object.assign(),但不支持 null/undefined 源)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










