slice()实现滑动窗口本质是利用其不修改原数组、支持负索引、起止位置可动态计算的特性,在固定长度内逐次提取子数组;它返回浅拷贝,参数自动截断,越界安全,适合性能敏感与不可变数据场景。
用 slice() 实现滑动窗口,本质是利用其不修改原数组、支持负索引、可动态计算起止位置的特性,在固定长度内逐次提取子数组。
理解 slice() 的滑动能力
slice(start, end) 返回从 start(含)到 end(不含)的浅拷贝。它不会改变原数组,且 start 和 end 可以是变量或表达式——这正是实现滑动的关键。
- 负索引表示从末尾计数,例如
arr.slice(-3)取最后三个元素 - 当
start ≥ end或越界时,返回空数组,安全无报错 - 所有参数自动被
Math.floor()处理,小数会被截断,适合配合索引计算
基础滑动窗口:固定长度、逐位移动
假设数组 data = [1,2,3,4,5,6],窗口长度为 size = 3,从索引 i 开始滑动:
const data = [1,2,3,4,5,6]; const size = 3; for (let i = 0; i <p>注意边界条件:<code>i</code> 最大取到 <code>data.length - size</code>,避免越界截取空内容。</p><h3>带边界的柔性滑动:允许不完整窗口</h3><p>若希望窗口始终存在(哪怕不足 <code>size</code>),比如处理实时流数据或滚动加载,可放宽限制:</p>
- 左对齐:从
i开始取最多size个 →data.slice(i, i + size) - 右对齐:取末尾
size个,但不超过当前已读范围 →data.slice(-Math.min(size, i + 1)) - 居中(以索引
center为中心):const half = Math.floor(size / 2); data.slice(Math.max(0, center - half), Math.min(data.length, center + half + size % 2))
结合其他方法增强实用性
slice() 单独使用轻量,搭配少量逻辑即可支撑常见场景:
- 分页:每页 5 条 →
list.slice((page - 1) * 5, page * 5) - 最近 N 条:如日志尾部 →
logs.slice(-10) - 去重后滑动(先用
filter()或Set预处理,再slice) - 与
map()链式调用:data.slice(i, i+3).map(x => x * 2)
不依赖外部库,零副作用,适合性能敏感或不可变数据流场景。










