做网页开发时,经常会遇到需要备份或传递一组数据的场景。比如用户在表格里勾选了几行商品,点击“批量复制”时,系统得把这组数据原样保留一份,防止后续操作误改原始内容。这时候,数组复制操作就成了关键一环。
常见的复制方式有哪些?
最简单的办法是直接赋值,比如 arr2 = arr1。但这样其实只是让两个变量指向同一个内存地址,改一个,另一个也会变。这种“假复制”在实际项目中容易埋下隐患。
真正安全的做法是创建新数组。常用的方法有展开运算符:
const arr1 = [1, 2, 3];
const arr2 = [...arr1];
这种方式简洁明了,适合大多数浅层复制需求。如果是嵌套结构,比如数组里还有对象或其他数组,就得考虑深拷贝了。
深拷贝怎么处理?
对于复杂数据结构,可以借助 JSON 方法临时解决:
const arr1 = [{ id: 1, tags: ['a', 'b'] }];
const arr2 = JSON.parse(JSON.stringify(arr1));
不过这招有局限,遇到函数、undefined 或 Symbol 会丢失数据。更稳妥的方式是使用递归函数或第三方库如 Lodash 的 cloneDeep。
性能上的取舍
在做网络请求频繁的页面,比如实时监控面板,每秒都要更新上千条记录的副本,这时候复制操作的效率就直接影响卡不卡。展开运算符和 slice() 在小数组上差别不大,但大数据量时,原生方法通常更快。
曾经有个项目,列表页每次搜索都全量复制一次上万条数据,结果页面明显延迟。后来改成按需引用加标记位的方式,只在真正修改时才触发复制,响应速度立马提升。
避免不必要的复制
有时候我们习惯性地复制数组,其实是多此一举。比如遍历展示数据时,只要不修改原数组,根本不需要先复制一遍。少写一行代码,可能就省下几十毫秒的执行时间。
特别是在 React 这类框架中,状态更新依赖引用变化,盲目复制还可能导致组件频繁重渲染。合理利用 useMemo 缓存复制结果,能有效减少重复计算。