是否修改原数组是核心区别:slice 返回新数组且不改变原数组,splice 直接修改原数组并返回被删元素;参数语义相反,slice(end)为不包含的终止索引,splice(deletecount)为删除个数;均支持负数索引但操作意图不同。

原数组是否被修改:最根本的分水岭
这是选择 splice 还是 slice 的第一道判断线。如果操作后你不希望原始数组发生变化,必须用 slice;如果明确需要直接改掉原数组,才考虑 splice。
比如处理表单数据或状态对象时,意外用 splice 修改了原始列表,后续渲染可能出错;而用 slice 获取分页数据、提取默认选项,就不会污染源数据。
- slice:永远返回新数组,原数组纹丝不动
- splice:一定改变原数组,返回的是被删掉的元素(不是新数组)
- 函数式编程、React/Vue 的响应式更新中,优先选 slice 避免副作用
参数含义完全不同:别把“删除个数”当成“结束位置”
两个方法都接受两个数字参数,但语义完全相反——这是新手踩坑最多的地方。
slice(start, end) 中的 end 是“不包含”的终止索引;splice(start, deleteCount) 中的第二个参数是“要删几个”。写反了,结果就全乱了。
-
arr.slice(1, 4)→ 取索引 1、2、3 三个元素(不含 4) -
arr.splice(1, 4)→ 从索引 1 开始,删掉 4 个元素(可能越界) - 想删一个元素?用
splice(i, 1),不是slice(i, i+1)(后者只是复制,不删)
负数索引行为一致,但效果容易误判
两者都支持负数索引,-1 表示最后一个,-2 表示倒数第二个……这点很友好,但也容易因理解偏差出错。
例如 arr.slice(-3, -1) 提取倒数第 3 到倒数第 1 之间的元素(不含 -1),即倒数第 3 和倒数第 2;而 arr.splice(-2, 1) 是从倒数第 2 位删 1 个——看似相似,动作却一取一删。
- 负数在 slice 中用于安全截取末尾片段(如
slice(-2)取最后两项) - 负数在 splice 中常用于动态移除末尾项(如清理缓存
splice(-1)) - 混合使用时建议加注释,避免团队协作时歧义
典型误用场景与替代方案
很多 bug 不是语法错,而是逻辑错——用错了方法意图。
- 想“复制并删掉某几项”?别链式调用
slice().splice(),先slice()得副本,再对副本用splice() - 只插入不删除?
splice(i, 0, ...items),注意第二个参数必须是 0 - 想替换元素?
splice(i, 1, newItem)比先删再 push 更原子、更清晰 - 批量提取多个子段?slice 可多次调用,splice 不适合——它只为修改服务
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











