object.assign 性能优于展开运算符,尤其大数据量时快千倍;小数据量下体验差异为主,展开更直观,object.assign 更易动态传参;高频场景宜原地更新或手动赋值,兼容性与语义常比性能更重要。

Object.assign 和对象字面量中使用展开运算符({...a, ...b})都能合并对象,但性能表现差异显著,尤其在数据量增大或高频调用时。
小数据量下写法差异不明显
几十个键值对以内,两者执行时间都接近 0 毫秒,开发体验是主要考量:展开语法更直观,Object.assign 更易动态传参(比如用数组解构传入多个对象)。
大数据量时 Object.assign 明显更快
实测连续合并 1 万次单属性对象(如 {key1: 1}、{key2: 2}…),Object.assign 耗时约 15 毫秒,而展开运算符高达 20755 毫秒——相差超千倍。原因在于:
- 展开运算符每次都要创建全新对象 + 遍历所有可枚举属性 + 分配内存,属于 O(n) 时间复杂度且 GC 压力大
- Object.assign 复用目标对象内存(若允许修改),避免频繁分配,底层优化更成熟
高频合并场景建议绕开两种方式
如果需要反复叠加配置或状态(如轮询更新、动画帧合并),直接拼接属性效率更低。可考虑:
- 用
Object.assign(target, updates)原地更新已有对象,省去重建开销 - 对超大对象,改用手动赋值或分片处理,避免一次性遍历全部属性
- 若必须生成新对象,且环境支持,可用结构化克隆(
structuredClone)配合增量更新逻辑
兼容性与语义选择比性能更常决定取舍
展开运算符不支持 IE,且无法处理 null 或 undefined(会报错),而 Object.assign 可自动跳过;但展开天然不污染原对象,语义更安全。实际项目中,90% 场景无需为性能换写法——除非你正在做实时音视频配置热更新或百万级数据预处理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











