首页 > 解决方案 > 什么时候(如果有的话)你会在 Javascript 中使用 splice 而不是 slice?(最佳实践)

问题描述

我一直在学习函数式编程概念。我读过的核心概念之一是限制修改外部变量的函数数量的重要性,以避免以后出现意外的潜在错误。考虑到这一点,我一直在阅读的材料建议使用 slice over splice 作为 slice 输出一个新数组而不修改现有数组,其中 splice 将修改现有数组。

考虑到你可以用 slice 做所有你可以用 splice 做的事情(考虑到它需要几行额外的代码),你什么时候会使用 splice over slice 来修改数组?我想知道我应该考虑在哪些场景中使用 splice 方法。我的主要考虑是在处理大型数组时调用 splice 可能会提高内存或 CPU 效率,因为它只是删除了值而不必存储 " before" 和 "after" 变量包含数组的两个部分,围绕您要删除的值,然后将它们连接在一起。此外,听起来使用切片可能会导致更多的内存和 CPU 效率低下,并且会变得更加糟糕,数组越大(使用的计算能力增加的线性函数)。但,也许我的考虑是错误的,或者还有其他我没有想到的情况。任何反馈都非常受欢迎。我只是想更深入地了解“纯函数”(不修改外部变量的函数)概念何时不适用或不是最佳用途。

这是一个示例,说明我如何看待 slice 在功能上能够做任何 splice 可以做的事情:

array = [1,2,3,4,5];

//using the splice method

array.splice(3,1);
// array is now [1,2,3,5]

//using the slice method

function replaceSplice(arr){

let sliceBefore = arr.slice(0,3);

let sliceAfter = arr.slice(4);

let modifiedArray = sliceBefore.concat(sliceAfter);

}

replaceSplice(array);

// returns a new array called modifiedArray with the values [1,2,3,5]

标签: javascriptarrays

解决方案


使用.slice,您将创建数组的两个副本,然后将它们合并。这不是非常理想.splice的,另一方面可以与底层数组实现一样快。

此外,一般来说,即使有替代方法,也最好有方法按照他们所说的去做。两者.slice.splice可以使用简单的for循环重新实现,但两者都可以用于各种目的。


推荐阅读