Javascript Array.push修改现有元素

Javascript Array.push修改现有元素,javascript,arrays,Javascript,Arrays,我正在做一个小的个人项目,我遇到了一些我不明白的事情,我希望有人能给我解释一下。我模块中的一个方法是SaveSet(),它接受一个数组并将其作为元素添加到另一个数组中,使其成为二维数组。下面是SaveSet()的代码: 当我运行这段代码时,我希望它获取集合数组中的任何内容,并将其作为如下元素添加到anim数组中 Set = [1,2,3,4] SaveSet() Set = [3,4,5,6] SaveSet() 我应该以这样的方式结束: [ [1,2,3,4] [3,4,5,6]

我正在做一个小的个人项目,我遇到了一些我不明白的事情,我希望有人能给我解释一下。我模块中的一个方法是SaveSet(),它接受一个数组并将其作为元素添加到另一个数组中,使其成为二维数组。下面是SaveSet()的代码:

当我运行这段代码时,我希望它获取集合数组中的任何内容,并将其作为如下元素添加到anim数组中

Set = [1,2,3,4]
SaveSet()
Set = [3,4,5,6]
SaveSet()
我应该以这样的方式结束:

[
   [1,2,3,4]
   [3,4,5,6]
]
但是,我的SaveSet()正在修改现有的存储集并添加一个新的存储集,因此我最终得到了类似的结果

[
  [1,2,3,4,3,4,5,6]
  [1,2,3,4,3,4,5,6]
]
通过将我的存储集()更改为以下内容,我找到了解决方法:

然而,我仍然不明白为什么anim.push也在修改现有的。这是完整的代码,如果有人想看的话。正如我所说,这是一个个人快速项目,因此代码和设计的质量非常低。

使用.push方法,将指针推入数组。 如果您将代码更改为

function SaveSet() {
    anim.push([...set])
}  
它将创建一个新阵列,传播当前场景元素,并将它们推送到动画中


您的集合数组可能由于代码另一部分中的错误而更改。它与此处无关

您总是对所有数据使用相同的数组

发生的情况是,在代码中全局初始化一个
集=[]

然后,每次保存一个集合时,都会将该数组添加到
anim
数组中,但永远不会更新变量
set
所指向的内容

因此,您只需反复添加相同的
set
数组:

var集=[];
var anim=[];
函数addToSet(){
set.push(String(Math.random()).slice(2,3));
控制台日志(set);
}
函数存储集(){

动画推送(设置);//您应该执行以下操作:

var anim = []
function SaveSet(set){
  anim.push(set);
}
var set = [1,2,3,4];
SaveSet(set);
set = [3,4,5,6];
SaveSet(set);

您问题中的示例代码不能准确反映代码笔中的实际代码。集合是JS中的内置集合(类似于数学集合)。不要将其用作变量名。也不明白为什么要使用函数,因为您引用的是全局函数。类似于
函数存储集(ary,addition){ary.push(addition);返回ari;}
在避免代码逻辑中出现此类问题方面将大有帮助,因为它要求您显式地将要更改的数组和要添加的数组发送给它。如果您想得到详细的解释,您必须阅读一些关于对象引用之类的内容。@JaredSmith我写这段代码的速度非常快,我不确定原因:D。这是一个不错的做法,但我我不认为改变它会解决这个问题。正如@Shilly所说,在目前的实践中,我不会遇到这样的问题,但我仍然对为什么会发生这种情况感兴趣。我认为array.push会添加一个新元素,并保持旧元素不变,但这里不是这样。我确实希望保持相同的数组,并在html w中的框中修改它我将选中红色onclick并向数组中添加一个元素,当我右键单击它们时将其从数组中删除,因此set=[];将不适用于我,因为我希望保留数组。当我选中特定数量的框并将其添加到数组中时,它可以工作,但当我添加或删除某些框并单击“保存”时,它将更改第一个框并添加新框。我在chromes控制台中进行了一些测试,但没有发生此行为!最后一个集=[]将没有帮助,因为他是重新分配集=[3,4,5,6],这基本上是一个新数组。@Mohammed知道
anim.push(set);
不复制
set
数组。如果你想在
anim
列表中使用单独的数组,你别无选择,只能在每个
.push()之间重新初始化
set
或显式推送您制作的副本。“新建”数组的概念不是基于它包含的数据,而是基于内存位置。“设置”变量始终指向内存中的同一位置,并且您始终从/向该位置推送和切片值。@Pointy so anim.push(设置)是否使用指向集合的指针创建一个数组,该数组将随着集合的变化而变化?这是怎么回事吗?因为我一直认为数组。在内存中创建一个点,保存其中的任何内容,就像一个变量!这对我来说是一些新消息!OP为什么要执行以下操作?
function SaveSet() {
    anim.push([...set])
}  
var anim = []
function SaveSet(set){
  anim.push(set);
}
var set = [1,2,3,4];
SaveSet(set);
set = [3,4,5,6];
SaveSet(set);