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



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

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

let arrs = [];
let arrs2 = [];
while(...){
arrs2.push(...);
arrs.push({ thisPointArrs2 : arrs2})
}

但是,"过滤器"函数没有问题。 "arrs"的属性"thisPointArrs2"值与我的预期不同。

let arrs = [];
let arrs2 = [];
while(...){
arrs2 = arrs2.filter(...);
arrs.push({ thisPointArrs2 : arrs2})
}

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

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

我建议阅读有关参考文献的信息,因为一开始可能会有点混乱 - 但是一旦您学会了如何处理它们,您就不希望有所不同。

由于您引用了不可变性标记,因此有一堆库通过使所有对象不可变来防止这种行为。使用其中之一,您将获得预期的结果 - 以及该行为可能出现的所有问题。用例是保护数据对象免受意外更改的影响。众所周知的库是不可变的.js或无记忆的。请注意,这可能是一个高级主题,对初学者可能没有用/必要。

最新更新