1. 扩展运算符与Object.assign的深度对比
在JavaScript开发中,对象和数组的操作是日常编码的基础。当我们需要复制或合并对象时,通常会面临两种主流选择:扩展运算符(...)和Object.assign()方法。这两种方式看似都能实现相似的功能,但在实际使用中却存在微妙的差异。
我曾在多个项目中同时使用过这两种方式,也踩过不少坑。比如有一次在React状态管理中错误使用Object.assign导致组件不更新,还有一次用扩展运算符合并多层嵌套对象时出现的引用陷阱。这些经验让我意识到,理解它们的本质区别比单纯知道如何使用更重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心概念解析
2.1 扩展运算符的工作原理
扩展运算符是ES6引入的语法糖,它的本质是遍历可迭代对象(如数组、对象)的所有可枚举属性。对于对象而言,它实际上执行的是浅拷贝操作:
javascript复制const obj = { a: 1, b: 2 };
const copy = { ...obj }; // 等同于Object.assign({}, obj)
在底层实现上,扩展运算符会:
- 创建一个新对象
- 遍历源对象的所有可枚举属性
- 将属性复制到新对象中
重要提示:扩展运算符对Symbol属性同样有效,这是许多开发者容易忽略的特性。
2.2 Object.assign的机制分析
Object.assign是ES5引入的方法,它的核心行为是:
javascript复制Object.assign(target, ...sources)
其工作流程包括:
- 检查target是否为对象(非对象会被转换为对象)
- 按顺序处理每个source对象
- 将每个source的可枚举属性(包括Symbol)复制到target
- 返回修改后的target
一个关键细节是:Object.assign会触发目标对象的setter方法,而扩展运算符不会。
3. 功能对比与使用场景
3.1 基本用法对比
| 特性 | 扩展运算符 | Object.assign |
|---|---|---|
| 语法简洁性 |
