Javascript 使用“推送”时,如何处理在已分配数组之后分配的已更改数组

Javascript 使用“推送”时,如何处理在已分配数组之后分配的已更改数组,javascript,arrays,immutability,Javascript,Arrays,Immutability,在Javascript中使用“推送”时,我发现了一件奇怪的事情 例如,“arrs”的属性“thisPointArrs2”值都是相同的。我希望它们是不同的,因为我分配“thisPointArrs2”时的每个点都是不同的。这是“不变”的东西吗?我不知道如何解决这个麻烦 let arrs = []; let arrs2 = []; while(...){ arrs2.push(...); arrs.push({ thisPointArrs2 : arrs2}) } 但是,函数“fi

在Javascript中使用“推送”时,我发现了一件奇怪的事情

例如,“arrs”的属性“thisPointArrs2”值都是相同的。我希望它们是不同的,因为我分配“thisPointArrs2”时的每个点都是不同的。这是“不变”的东西吗?我不知道如何解决这个麻烦

let arrs = [];
let arrs2 = [];

while(...){

  arrs2.push(...);
  arrs.push({ thisPointArrs2 : arrs2})

}


但是,函数“filter”没有问题。“arrs”的属性“thisPointArrs2”值与我预期的不同

let arrs = [];
let arrs2 = [];

while(...){

  arrs2 = arrs2.filter(...);
  arrs.push({ thisPointArrs2 : arrs2})

}



第一个示例和第二个示例之间的区别是,.push更改了数组的内部,添加了一个,而.filter创建了一个新数组,请参见。由于数组不是基元,因此它们是通过引用插入的

spread操作符获取一个对象的所有属性,并将它们放入一个新对象中,这就是它求解对象的原因。Object.assign与spread基本相同

我建议,因为一开始可能会有点困惑——但一旦你学会了如何处理它们,你就不想有什么不同了


因为您引用了不变性标记,所以有很多库通过使所有对象都不可变来防止这种行为。使用其中一种方法,您将得到您期望的结果,以及由此行为可能产生的所有问题。用例是保护数据对象不受意外更改的影响。著名的图书馆是或。请注意,这可能是一个高级主题,对于初学者来说可能没有用处/必要。

oh。。Object.assign或spread运算符已解决此问题。此行为是由于引用了f对象造成的。我们需要在将对象分配或推送到其他数组或分配给对象之前克隆对象。如果它们只是字符串或数字或布尔类型,那么我不需要考虑引用吗?在这种情况下,不需要引用。你可以在这里详细说明