用 slice 配合展开语法复制数组部分元素,本质是先 slice 提取子数组再用 ... 展开到新数组中;写法简洁、语义清晰,适合构造含复用片段的新数组,且支持灵活拼接、负索引及越界安全处理。

用 slice 配合展开语法(...)复制数组的一部分,本质是先用 slice 提取子数组,再用展开运算符把它“铺开”到新数组中。这不是必须的组合,但写法简洁、语义清晰,尤其适合构造新数组时复用某段数据。
基本写法:slice 提取 + 展开拼接
slice(start, end) 返回原数组从 start(含)到 end(不含)的浅拷贝子数组;展开语法可把该子数组“打散”进新数组里。例如:
const arr = [10, 20, 30, 40, 50];
const part = [...arr.slice(1, 4)]; // → [20, 30, 40]
这等价于 arr.slice(1, 4),但加了 [...] 后,明确表达了“我要一个新数组”,也方便后续与其他元素组合。
配合其他元素一起构造新数组
展开语法的优势在于灵活拼接。你可以把 slice 的结果和其他值、其他数组混合使用:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- [...'abc'.split('')] → ['a', 'b', 'c'](字符串转数组并展开)
- [0, ...arr.slice(2, 4), 99] → [0, 30, 40, 99](前后插入额外值)
- [...arr.slice(0, 2), ...arr.slice(3)] → [10, 20, 40, 50](跳过第 2 项)
注意边界和默认行为
slice 的参数支持负数(从末尾计数),且不传 end 时默认到末尾。展开语法不会改变原数组,整个过程都是不可变操作:
-
arr.slice(-2) → [40, 50],
[...arr.slice(-2)]就是它的副本 -
arr.slice(10) → [](越界返回空数组),
[...arr.slice(10)]得到[],安全无报错 - 起始索引大于等于结束索引(如
slice(3, 2))也返回空数组,展开后仍是空数组
和直接赋值、Array.from 的区别
[...arr.slice(i, j)] 和 arr.slice(i, j) 在结果上完全一样,都是新数组;加展开主要是为了“可组合性”。如果只是单纯复制一段,不用展开更直接。但若要嵌入更大结构,展开就更自然:
// 想在开头加个标识,末尾加个时间戳
const logEntry = ['INFO', ...data.slice(5, 8), Date.now()];
而 Array.from(arr.slice(i, j)) 或 arr.slice(i, j).concat() 等写法更冗长,没必要。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










