更新:我现在了解到,在下面的代码中,当我遍历aggregateData
时,我正在对pagedData
数组进行变异。
const pagedData = [
{data: ["val1", "val2"], nextPage: 2},
{data: ["val3", "val4"], nextPage: 3},
{data: ["val5", "val6"]}
];
const aggregator = () => {
let aggregateData = [];
let hasNextPage;
let page = 1;
do {
const { data, nextPage } = pagedData[page - 1];
aggregateData = [...aggregateData, ...data];
page = nextPage;
hasNextPage = nextPage;
} while (hasNextPage);
return aggregateData;
}
console.log(aggregator());
/* output: ["val1", "val2", "val3", "val4", "val5", "val6"] */
发布于 2021-06-26 18:39:16
不变性有时有助于减少捕获错误的难度,但这可能并不总是必需的,也不是理想的情况。
什么是不变的?
不改变价值意味着不变性。在Javascript,数组和对象是可变的。.
不变性的例子:
let arr = ['John', 'Alice'];
// Adding element is mutating
arr.push('Oliver');
// Updating data is mutating
arr[1] = 'Lily'
许多其他函数可以对这个数组进行变异。更多这里
另外,请注意,将数组或对象定义为const
并不能保证不可变性。例如:
const obj = {
name: 'foo'
}
// update name
obj.name = 'bar';
console.log(obj);
const arr = ['foo'];
// push new item
arr.push('bar');
console.log(arr);
现在回答你的问题。传动员什么时候可以变异,什么时候不是?
如果我们有这个数组,当这个数组中的任何数据发生变化时,它就会失去不可变性。
let arr = ['Obito', 'Sasuke'];
let sameReferenceArray = arr;
console.log(arr === sameReferenceArray);
// here the original array did not mutate
let newArray = [...arr, 'Madara'];
console.log(arr === sameReferenceArray);
// but here it did mutate as the new array is assigned back to arr
arr = [...arr, 'Madara'];
console.log(arr === sameReferenceArray);
有更多的例子说明哪些方法会发生变异,哪些方法不会发生变化,随着时间的推移,您将了解到它们。
编辑突变如何会产生负面影响?
// simple example demostrating negative impact of mutataion
const obj = { name: "foo" };
const arr = [obj, obj]
console.log(arr);
// Mutating first element
arr[0].name = "bar";
console.log("Contents after mutation", arr);
正如您所看到的,我们最终更新了两个对象,尽管我们在索引0处更新了一个对象。
现在我要传播和变异:
const obj = { name: "foo" };
const arr = [{...obj}, {...obj}]
console.log(arr);
// Mutating first element
arr[0].name = "bar";
console.log("Contents after mutation", arr);
现在只有预期的元素发生了变异。
还有更多的事情要做。一般来说,如果你已经开始学习的话,不变性不应该是一个很大的问题。但知道这一点当然有帮助。
例如,在React
状态下不应该发生变异(原因)
最后,关于如何更新“聚合数据”。
const aggregator = () => {
let aggregateData = [];
let hasNextPage;
let page = 1;
do {
const { data, nextPage } = pagedData[page - 1];
aggregateData = [...aggregateData, ...data];
page = nextPage;
hasNextPage = nextPage;
} while (hasNextPage);
return aggregateData;
}
因为您将数据预先预置到数组中,所以无论如何都会对其进行变异。你可以做spread
或push
什么的。这一切都很好,因为数组是在函数中本地创建并返回的。
例如,它可能是一个问题:
const aggregator = (aggregateData) => {
for (const i = 0; i < 5; i++)
aggregateData = [...aggregateData, i];
return aggregateData;
}
const example = () => {
let arr = [];
let data = aggregator(arr);
// if this array is passed to couple other functions too and mutated then it will get hard to track. This is where the issue can occur
}
example();
https://stackoverflow.com/questions/68145005
复制相似问题