splice无法避免修改原数组,必须用tospliced、slice+扩展运算符或filter等不可变方法替代;其返回被删元素组成的新数组,不改变原数组的唯一方式是不调用splice本身。

JavaScript中splice()是直接操作原数组的方法,它既能删除、插入,也能替换元素,但**无法避免修改原数组**——这是它的设计本质。如果想“不改变原数组”,必须手动创建新数组再操作,不能依赖splice本身实现不可变操作。
Splice 的基本语法和增删改用法
arr.splice(start, deleteCount, ...items):从start索引开始,删除deleteCount个元素,再插入后面的items(可选)。
-
删除:只传前两个参数,如
arr.splice(1, 2)→ 删除索引1起的2个元素 -
插入:
deleteCount设为0,如arr.splice(2, 0, 'a', 'b')→ 在索引2前插入'a'和'b' -
替换:先删后插,如
arr.splice(1, 1, 'new')→ 删除索引1处1个元素,插入'new'
Splice 返回值是什么?别忽略它
splice返回的是**被删除的元素组成的数组**(哪怕只删1个,也返回数组),不是原数组。这个返回值常被用来捕获删掉的内容:
const arr = [1, 2, 3, 4]; const removed = arr.splice(1, 2); // removed 是 [2, 3],arr 变成 [1, 4]
注意:返回值是新数组,但它和原数组无关;原数组已被修改。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
想不改原数组?得绕开 splice 直接操作
因为splice天生就地修改,要保持原数组不变,只能用其他方法构造新数组:
-
删除元素(不改原数组):用
slice拼接,如[...arr.slice(0, i), ...arr.slice(i + 1)] -
插入元素:用扩展运算符,如
[...arr.slice(0, i), 'new', ...arr.slice(i)] -
替换元素:类似插入,把旧位置跳过,如
[...arr.slice(0, i), 'new', ...arr.slice(i + 1)] - 更简洁的方式是结合
toSpliced()(ES2023新增):arr.toSpliced(i, 1, 'new')—— 它返回新数组,不修改原数组
常见误区提醒
有人尝试用splice前先拷贝数组,比如arr.slice().splice(...),这确实能保护原数组,但要注意:
-
slice()只做浅拷贝,若数组含对象,对象引用仍相同 - 频繁拷贝+
splice性能不如直接用toSpliced或concat+slice组合 -
splice的start支持负数(从末尾计数),但deleteCount不能为负
不复杂但容易忽略:想不可变,就别用splice做主操作;该用toSpliced、filter、map或展开语法时,优先选它们。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










