什么时候(如果有的话)会在Javascript中使用splice而不是slice?(最佳做法)

什么时候(如果有的话)会在Javascript中使用splice而不是slice?(最佳做法),javascript,arrays,Javascript,Arrays,我一直在学习函数式编程的概念。我读过的一个核心概念是限制修改外部变量的函数数量的重要性,以避免以后出现意外的潜在错误。 考虑到这一点,我一直在阅读的材料建议在切片输出一个新阵列时使用切片对拼接,而不修改现有阵列,其中拼接将修改现有阵列 考虑到你可以用slice做任何你可以用splice做的事情(考虑到它需要两行额外的代码),你什么时候会用splice-over-slice来修改数组?我想知道什么样的场景我应该考虑使用拼接方法。我主要考虑的是,在处理大型数组时,splice调用可能更节省内存或CP

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

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

下面是一个示例,我认为slice在功能上能够完成splice所能完成的一切:

array=[1,2,3,4,5];
//使用拼接方法
阵列拼接(3,1);
//数组现在是[1,2,3,5]
//使用切片法
功能替换拼接(arr){
设sliceBefore=arr.slice(0,3);
设sliceAfter=arr.slice(4);
让modifiedArray=sliceBefore.concat(sliceAfter);
}
替换拼接(阵列);

//返回一个名为modifiedArray的新数组,其值为[1,2,3,5]
,使用
.slice
,您将创建数组的两个副本,然后合并它们。这不是很理想,
.splice
在另一方面可以和底层阵列实现一样快


此外,一般来说,即使有其他选择,通常最好是让方法按照他们说的去做。
.slice
.splice
都可以使用一个简单的
for
循环重新实现,但是这两个都可以用于不同的目的。

因此我有一个用PHP编写的应用程序,在前端自然使用JS。该应用程序允许用户查询学校和学区内的学生。所以流程是这样的:选择你的学区,它向服务器发送一个ajax调用,以检索与该学区相关联的学校。然后根据地区过滤器将适当的学校填充到下一个选择字段中。然后根据选择的学校,它发送一个ajax请求以获取该学校的所有学生。该应用程序发回了一系列学校和学生,我在选项中循环了这些学校和学生。因此,如果我在每个选项上都有一个复选框,以隐藏特定的学校或出于某种原因隐藏特定的学生,我可以使用splice将其从阵列中删除,而无需对服务器进行另一次查询。这样做让我感到舒服的唯一原因是,我可以用一个新的查询重新生成该数组。我个人从来没有在硬编码阵列上进行拼接的用例,这些硬编码阵列不是由某种查询生成的。我很好奇,看看其他用户自己是否有一个可靠的用例。有趣的问题。

splice正在变异现有阵列,而slice创建了阵列的浅拷贝。 如果要从原始阵列中添加/删除项,请使用“拼接”。 要复制阵列时,请使用切片

在旧js时代,slice被用来将参数复制到数组中

函数(){
typeof arguments.map;//=>“未定义”
var copy=[].slice.call(参数);
typeof arguments.map;//=>“函数”
}
不能使用slice在数组中插入项,但可以使用splice。 示例来自:

像推一样使用

months.splice(months.length, 0, 'May');
// expected output: Array ['Jan', 'March', 'April', 'June', 'May']
选择是否使用突变取决于不同的因素。但一般来说,尽量避免代码中的变异。不可变代码不易出错,易于测试,并且产生的副作用更少

考虑到你可以用slice做任何你可以用splice做的事情(考虑到它需要两行额外的代码),你什么时候会用splice-over-slice来修改数组

首先,
slice
不能做
splice
做的事,
splice
不能做
slice
做的事。重要的区别在于,
splice
就地修改数组,无法创建浅层副本,
slice
无法就地修改数组,始终创建浅层副本

两者的一个很好的例子是使用一个函数,该函数接受数组作为参数,并执行某种转换:

函数转换(数组){
//如果不执行此操作,请切片阵列以创建浅层副本
//将修改输入数组,调用方可能不会修改
//期待。
array=array.slice();
for(设i=array.length;i>=0;--i){
//由于使用了数组的副本,因此我们可以修改数组
//我们不需要修改原件。让我们插入一个
//元素轻松地围绕原始数组的每个元素。
阵列拼接(i,0,'-');
}
返回数组;
}
常量数组=[1,2,3,4,5];
log(someTransformation(array));

console.log(数组)请在问题中添加一些格式。好的,给我一点时间来弄清楚如何修改帖子,我将在顶部分解文本。对不起,这是我的第一个问题。
splice
对原始数组进行变异,
slice
不执行?
months.splice(months.length, 0, 'May');
// expected output: Array ['Jan', 'March', 'April', 'June', 'May']