浅拷贝仅隔离第一层:slice()、展开运算符和Array.from()均生成新数组,基本类型互不影响,但对象等引用类型仍共享内存;需彻底隔离时应使用深拷贝。

用 slice()、展开运算符或 Array.from() 就能快速复制数组并实现第一层隔离——基本类型互不影响,引用类型仍共享,这是浅拷贝的本质。
最常用:slice() 空参数直接拷贝
调用 arr.slice() 不传任何参数,内部等价于 slice(0),会返回一个新数组,包含全部元素:
- 原数组和副本是不同引用:
arr === arr.slice()返回false - 基本类型(数字、字符串等)修改互不干扰
- 对象、数组等引用类型仍指向同一内存地址,改属性会同步体现
更直观:展开运算符 [...arr]
ES6 写法语义清晰,可读性高,效果与 slice() 完全一致:
- 适合现代项目,兼容主流浏览器和 Node.js 环境
- 可用于拼接:
[...arr1, ...arr2] - 注意:不能直接用于类数组对象(如
arguments),需先转为真数组
兼容老环境:concat() 或 Array.from()
arr.concat() 和 Array.from(arr) 同样返回新数组,属于标准浅拷贝方式:
-
concat()原本用于合并,空调用时恰好实现拷贝,但语义稍弱 -
Array.from()更通用,支持类数组和可迭代对象(如NodeList) - 三者性能差异极小,日常开发中任选其一即可
关键提醒:浅拷贝 ≠ 完全隔离
所有上述方法都只处理第一层:
- 如果数组里存的是普通数字或字符串,副本修改不会影响原数组
- 如果存的是对象、嵌套数组或函数,副本中对这些值的属性或内容修改,原数组对应项也会变
- 需要彻底隔离(比如表单编辑、配置快照),必须用深拷贝,如
structuredClone()或JSON.parse(JSON.stringify())(注意限制)











