扩展运算符(...)是JavaScript中实现浅拷贝和合并数组、对象最简洁的方式,仅复制第一层属性,不处理嵌套结构;数组中用[...arr]浅拷贝或[...arr1, ...arr2]合并,对象中用{...obj}浅拷贝或{...obj1, ...obj2}合并,但均无法深拷贝。

扩展运算符(...)是 JavaScript 中实现浅拷贝和合并数组、对象最简洁的方式之一,它只复制第一层属性,不处理嵌套结构。
数组的浅拷贝与合并
对数组使用扩展运算符会将元素逐个展开,生成一个新数组,原数组不受影响。
- 浅拷贝:用
[...arr]创建新数组,修改新数组不会影响原数组(但若元素是引用类型,其内部内容仍共享) - 合并多个数组:可直接拼接,如
[...arr1, ...arr2, ...arr3] - 开头/中间插入元素:例如
[0, ...arr, 99]或[arr[0], 'new', ...arr.slice(1)]
对象的浅拷贝与合并
对对象使用扩展运算符会将其自身可枚举属性(不含原型链)复制到新对象中,同样只作用于第一层。
- 浅拷贝:
{...obj}创建新对象,修改新对象的顶层属性不影响原对象 - 合并多个对象:按顺序展开,后出现的同名属性会覆盖前面的,例如
{...obj1, ...obj2} - 添加或覆盖属性:
{...obj, name: 'Alice', age: 30}—— 新增字段或覆盖已有字段
需要注意的浅拷贝限制
扩展运算符无法深拷贝。如果数组元素或对象属性是对象、数组等引用类型,拷贝后它们仍指向同一内存地址。
立即学习“Java免费学习笔记(深入)”;
- 例如:
const a = [{x: 1}]; const b = [...a]; b[0].x = 2;→a[0].x也会变成 2 - 对象嵌套时同理:
const obj = {user: {name: 'Tom'}}; const copy = {...obj}; copy.user.name = 'Jerry';→ 原对象obj.user.name同样被改 - 需要深拷贝时,应考虑
structuredClone()、JSON 序列化(仅适用于纯数据),或专用库如 lodash 的cloneDeep
替代写法与兼容性提示
扩展运算符是 ES2015+ 特性,现代浏览器和 Node.js 环境基本都支持。若需兼容旧环境(如 IE),可用 Array.prototype.slice() 或 Object.assign() 替代:
- 数组拷贝:
arr.slice()或Array.from(arr) - 对象拷贝:
Object.assign({}, obj),合并用Object.assign({}, obj1, obj2) - 注意:
Object.assign()和扩展运算符行为一致,都是浅拷贝、可枚举属性、后者覆盖前者


















