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

问题描述 投票:0回答:1

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

例如,“ 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})

}


javascript arrays immutability
1个回答
0
投票

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

散布运算符采用对象的所有属性,然后将它们放在新对象中,这就是为什么它解决了您的对象的原因。 Object.assign基本上与点差相同。

我建议使用reading about references,因为起初可能会有些混乱-但是一旦学习了如何处理它们,您就不会想让它有所不同。

由于您引用了不可变性标签,所以有一堆库通过使所有对象均不可变来完全防止此行为。使用其中之一,您将获得预期的结果以及该行为可能引起的所有问题。用例可以保护数据对象免遭意外更改。众所周知的库是immutable.jsimmer。请注意,这可能是一个高级主题,对初学者可能没有用/不必要。

© www.soinside.com 2019 - 2024. All rights reserved.