使用 'push' 时如何处理在分配的数组之后分配的更改数组

How to handle a changed array allocated following the allocated array when using 'push'

我刚刚在Javascript中使用'push'时发现了一个奇怪的事情。

例如'arrs'的属性'thisPointArrs2'值都是一样的。我预计它们会有所不同,因为我分配 'thisPointArrs2' 时的每个点都是不同的。这是 'immutable' 的东西吗?不知道怎么解决这个麻烦

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 创建了一个新数组(参见 docs) .由于数组不是基元,它们是通过引用插入的。

传播运算符获取一个对象的所有属性并将它们放入一个新对象中,这就是它解决您的对象的原因。 Object.assign与点差基本相同

我推荐 reading about references,因为一开始它可能有点令人困惑 - 但一旦你学会了如何处理它们,你就不会希望它有所不同。

由于您引用了不可变标签,因此有许多库通过使所有对象不可变来防止这种行为。使用其中之一,您将获得预期的结果 - 以及该行为可能引起的所有问题。用例是保护数据对象免受意外更改。众所周知的库是 immutable.js or immer。请注意,这可能是一个高级主题,可能 useful/necessary 不适合初学者。