展开运算符 {...obj} 和 object.assign({}, obj) 在浅拷贝功能上等价,均只复制第一层属性、按顺序覆盖、不修改原对象、结果为新对象;但语法简洁性、动态参数支持、数组处理、兼容性和错误处理存在差异。

展开运算符 {...obj} 和 Object.assign({}, obj) 在实现对象浅拷贝时功能等价,但语法、适用范围和细节处理有明确差异。
核心行为完全一致
两者都只复制对象第一层属性,不递归处理嵌套对象;同名属性按从左到右顺序覆盖;原对象保持不变;结果都是一个新对象。
- 浅拷贝本质相同:内部都只复制引用,嵌套对象仍共享内存地址
-
覆盖逻辑一致:
{a: 1, ...{a: 2}}和Object.assign({a: 1}, {a: 2})都返回{a: 2} -
都不修改源对象:无论
obj是否冻结或不可配置,二者均创建独立副本
语法与可读性差异明显
展开运算符写法更紧凑直观,适合静态结构;Object.assign 更显式,便于动态传参或链式调用。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
展开写法:
const copy = {...original}—— 直观、简洁、现代 -
assign 写法:
const copy = Object.assign({}, original)—— 明确体现“赋值”动作,适合多源合并场景 -
动态参数支持:
Object.assign可配合数组展开:Object.assign({}, ...configs);展开运算符无法直接替代这种模式
数组处理能力不同
展开运算符天然支持数组拷贝与拼接;Object.assign 需额外适配才能用于数组,且语义不够自然。
-
数组拷贝:
[...arr]直接可用;Object.assign([], arr)虽可行,但易被误读为“向空数组赋值” -
混合拼接:
[0, ...arr1, 5, ...arr2]表达清晰;Object.assign无对应能力 -
类数组对象:展开运算符可作用于
arguments、NodeList等;Object.assign默认只处理普通对象属性
兼容性与工程选择建议
若需支持 IE 或旧版 Node.js,Object.assign 是稳妥选择;现代项目优先用展开运算符,兼顾可读性与维护性。
-
兼容性:
Object.assign支持到 ES5 环境(需 polyfill);展开运算符要求 ES2015+(Babel 可转译) -
错误提示友好度:传入
null或undefined时,展开运算符直接报错;Object.assign会跳过无效源,行为更宽容 -
团队规范倾向:多数新项目统一使用展开语法;遗留系统或需要运行时参数控制时,保留
Object.assign
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










