[我在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})
}
[第一个示例和第二个示例之间的区别在于,.push
更改了数组的内部(添加一个),而.filter
创建了一个新的数组(请参见docs)。由于数组不是基元,因此可以通过引用插入它们。
散布运算符采用对象的所有属性,然后将它们放在新对象中,这就是为什么它解决了您的对象的原因。 Object.assign
基本上与点差相同。
我建议使用reading about references,因为起初可能会有些混乱-但是一旦学习了如何处理它们,您就不会想让它有所不同。
由于您引用了不可变性标签,所以有一堆库通过使所有对象均不可变来完全防止此行为。使用其中之一,您将获得预期的结果以及该行为可能引起的所有问题。用例可以保护数据对象免遭意外更改。众所周知的库是immutable.js或immer。请注意,这可能是一个高级主题,对初学者可能没有用/不必要。