我在我的项目历史记录中有更改的历史。历史是一个数组,其中每个对象都有2个数组。
因此,当我添加历史快照时,它看起来像这样(但实际上我不会添加空数组):
history.push({ //new history moment
firstP: [],
secondP: [],
})
例如,数组firstP由以下对象组成:
{
color: "red",
move: 1,
... and some other fields (max 14 fields if it matters)
}
firstP和secondP通常持有数千个对象。 因此,每个历史快照对于内存来说相当沉重。 所以我添加了限制。
const limitOfSteps = 50;
现在,在每次推送之后,我会检查历史记录的长度是否大于50。如果是,我就会执行history.shift();
但是我发现,即使在移位(删除数组中的第一个元素)时,使用的内存也在增加。当用户在React应用程序中执行某些操作时,该元素将添加到历史记录中,因此他可以随心所欲地进行多次更改。
我知道有垃圾回收器,但它如何处理数组呢?移位数组应该意味着该元素已经消失了(并且从内存中消失了?),但它不会立即消失(如果用户快速进行更改,则整个应用程序将耗尽内存)。
在移位数组之前(刚好在删除元素之前)将被删除的元素更改为未定义或null是否会更快地释放内存?
主要目标是使用更少的内存...有人知道怎么做吗?
编辑:数组可能会被移位一千次。
编辑2(也许我的问题完全错了?也许我应该问的是当整个数组被删除时?) 这都在React应用程序中的状态中。
可能切片历史记录(进行复制)会更耗费内存,但这是不可避免的,因为状态是不可变的。我的更新方法看起来像这样:
updateHistory = (newElement) => {
const history = this.state.history.slice();
history.push(newElement);
if(history.length - 1 > 50) history.shift();
this.setState({history: history});
}
这有任何意义吗?
unshift() "在数组的开头添加一个或多个元素"
。它不会移除任何元素。 - undefinedfirstP
和secondP
的代码。这些元素是如何创建的?它们还从哪里引用了其他地方?请发布那段代码。history
数组本身只有50个元素,不会有什么影响。 - undefined