扩展运算符[...arr]仅实现数组浅拷贝,只复制第一层元素;对嵌套对象或数组仍共享引用,修改其属性会影响原数组。

用扩展运算符 ... 实现数组浅拷贝,本质是把原数组的每个元素依次展开,放进一个新数组里。它只复制第一层,不深入嵌套对象或数组。
基本写法:直接展开到新数组
这是最常用、最简洁的方式:
const original = [1, 2, 3]; const copy = [...original];
此时 copy 是独立的新数组,修改它不会影响 original(对基础类型元素而言)。
注意:浅拷贝对嵌套结构无效
如果数组里包含对象或子数组,这些引用值本身被复制,而非其内容:
const original = [1, { name: 'Alice' }, [4, 5]];
const copy = [...original];
copy[0] = 99; // ✅ 不影响 original[0]
copy[1].name = 'Bob'; // ❌ original[1].name 也变成 'Bob'
copy[2].push(6); // ❌ original[2] 现在是 [4, 5, 6]
因为对象和数组是引用类型,扩展运算符只复制了它们的地址,没创建新副本。
和其他浅拷贝方式对比
扩展运算符和以下方法效果一致(都是浅拷贝):
Array.from(original)original.slice()-
original.concat()(空参数时)
区别在于可读性与灵活性:扩展运算符语法更直观,还支持拼接、过滤等操作,比如:
const a = [1, 2]; const b = [3, 4]; const merged = [...a, 5, ...b]; // [1, 2, 5, 3, 4]
什么时候慎用扩展运算符?
以下情况建议换其他方式:
- 数组非常大(如百万级),扩展运算符可能触发栈溢出或性能下降;可用
Array.from()或循环 - 需要深拷贝——得配合
JSON.parse(JSON.stringify())(简单场景)或结构化克隆(structuredClone()) - 原数组含函数、undefined、Symbol、BigInt 或循环引用,扩展运算符照常工作,但 JSON 方法会丢失或报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











