可用展开运算符配合map实现对象数组批量浅拷贝:arr.map(item => ({...item})),返回新数组及新对象引用,但嵌套对象仍共享内存。

可以用展开运算符 ... 配合 map 方法,对对象数组做批量浅拷贝——即复制数组本身,并对每个对象生成一个新引用、但属性值仍为浅层复制的新对象。
核心写法:arr.map(item => ({...item}))
这是最简洁、常用的方式:
-
map遍历原数组每一项(每个对象) -
{...item}利用展开运算符将对象的自有可枚举属性“展开”到一个新空对象中,实现该对象的浅拷贝 - 返回的是一个全新数组,与原数组无引用关系;每个元素也是新对象,与原对象无引用关系(但其内部嵌套对象/数组仍共享引用)
为什么是“浅拷贝”?关键要理解限制
这种写法只拷贝第一层属性,不处理嵌套结构:
- 若
item中有普通类型(字符串、数字、布尔值),拷贝后完全独立 - 若
item中有对象或数组(如user.profile或item.tags),拷贝后仍指向同一内存地址 - 例如:
const arr = [{name: 'Alice', info: {age: 30}}]; const copy = arr.map(x => ({...x})); copy[0].info.age = 31; // 原 arr[0].info.age 也会变成 31
常见实用变体
根据需求可灵活组合:
-
拷贝同时修改部分字段:
arr.map(({id, name, ...rest}) => ({id, name: name.toUpperCase(), ...rest})) -
过滤 + 拷贝:
arr.filter(x => x.active).map(x => ({...x})) -
添加新属性:
arr.map(x => ({...x, createdAt: new Date()})) -
配合解构避免污染原对象:
arr.map(({__v, _id, ...clean}) => ({...clean}))(常用于去除 MongoDB 字段)
对比其他方法
相比 JSON.parse(JSON.stringify(arr))(深拷贝但丢失函数、undefined、Date 等)或 arr.map(Object.assign({}, item))(功能等价但更冗长),展开运算符写法更直观、现代、可读性高,且性能良好。










