展开运算符...可对数组和对象实现浅拷贝,仅复制第一层属性,嵌套对象或数组仍共享引用;正确写法为[...arr]或{...obj},支持拼接与合并,但无法避免深层修改影响原数据。

展开运算符 ... 可以对数组和对象做浅拷贝,但要注意它只复制第一层属性,嵌套的对象或数组仍共享引用。
用 ... 对数组进行浅拷贝
展开运算符将数组的每个元素逐个取出,放入新数组中,生成一个新数组实例。
✅ 正确用法:
const newArr = [...oldArr];- 支持与其它元素组合:
const newArr = [0, ...oldArr, 99];
⚠️ 注意:如果 oldArr 中包含对象或嵌套数组,这些内部值不会被深拷贝。例如:
const arr = [1, {name: 'Alice'}];
const copy = [...arr];
copy[1].name = 'Bob';
console.log(arr[1].name); // 'Bob' —— 原数组也被改了
用 ... 对对象进行浅拷贝
展开运算符会提取对象自身可枚举属性(不含原型链上的),并复制到新对象中。
✅ 正确用法:
const newObj = {...oldObj};- 支持合并多个对象:
const merged = {...obj1, ...obj2};(后者同名属性会覆盖前者)
⚠️ 注意:同样只拷贝第一层。嵌套对象仍是引用:
const obj = {a: 1, user: {id: 101}};
const copy = {...obj};
copy.user.id = 202;
console.log(obj.user.id); // 202 —— 原对象被影响
浅拷贝 vs 深拷贝的关键区别
展开运算符是典型的浅拷贝工具,适合处理纯值类型(字符串、数字、布尔)或确定无嵌套结构的数据。
- ✅ 它比
Array.from()或Object.assign()更简洁,语义更清晰 - ❌ 不能替代深拷贝(如需深拷贝,可用
JSON.parse(JSON.stringify())(有局限)或结构化克隆、第三方库) - ? 判断是否需要深拷贝:修改拷贝后的嵌套内容时,是否允许原数据同步变化?不允许就别用
...
常见误用提醒
不要对非可迭代对象(如 null、undefined、普通函数)使用展开运算符,会报错。
-
{...null}→ TypeError -
[...undefined]→ TypeError - 安全做法:拷贝前先检查类型,或用空数组/对象兜底:
{...(obj || {})}、[...(arr || [])]
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











