toSpliced 是 ES2023 引入的原生不可变版 splice,参数和行为完全一致但返回新数组;兼容性不足时可用 slice + concat 模拟,或选用更轻量的扩展运算符、filter 等替代方案。
想用 splice 的功能但又不想改原数组?直接换用 tospliced 就是最干净的解法——它接口一致、语义清晰、原生支持不可变操作。
toSpliced:原生不可变版 splice
ES2023 引入的 toSpliced 是 splice 的“孪生兄弟”,参数完全相同(start、deleteCount、插入项),但不修改原数组,而是返回一个新数组。
- 删除元素:
[1, 2, 3, 4].toSpliced(1, 2)→[1, 4] - 插入元素:
[1, 2, 3].toSpliced(1, 0, 'a', 'b')→[1, 'a', 'b', 2, 3] - 替换元素:
['a', 'b', 'c'].toSpliced(1, 1, 'x')→['a', 'x', 'c']
负数索引、越界处理(如 deleteCount 超出范围时自动截断)等行为与 splice 完全一致,学习成本几乎为零。
兼容性不足时的手动替代写法
若需支持 Node.js < 19.5 或 Chrome < 114,可用 slice + concat 组合模拟:
- 只删不插:
[...arr.slice(0, start), ...arr.slice(start + deleteCount)] - 只插不删:
[...arr.slice(0, start), ...inserts, ...arr.slice(start)] - 边删边插:
[...arr.slice(0, start), ...inserts, ...arr.slice(start + deleteCount)]
注意:这种写法对稀疏数组(含空位)的处理不如 toSpliced 精准——slice 会把空位转成 undefined,而 toSpliced 保留 hole。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
更轻量的不可变场景替代方案
不是所有 splice 场景都需要完整接口。多数日常需求可用更简洁、兼容性更好的方法替代:
- 单点替换 → 直接用扩展运算符:
[...arr.slice(0, i), newValue, ...arr.slice(i + 1)] - 过滤删除 → 用 filter:
arr.filter((_, idx) => idx !== targetIndex) - 头部/尾部增删 → concat 或展开语法:
[newItem, ...arr]或[...arr, newItem]
这些方法语义明确、无副作用,且在所有现代环境中稳定运行。
为什么不该再手动封装“安全 splice”
网上常见手写函数模拟不可变 splice,看似灵活,实则隐患不少:
- 容易忽略负索引、越界、稀疏数组等边界情况
- 插入多个元素时易错用
concat或push导致嵌套数组 - 性能不如原生 toSpliced(V8 对其做了专门优化)
- 维护成本高,不如直接升级环境或使用 Babel 插件降级
推荐优先启用 @babel/plugin-transform-array-prototype-to-spliced,让代码既现代又可靠。

















