首页 > 解决方案 > 不可变变量和纯函数更新状态

问题描述

我正在学习不变性和纯函数。作为一个新手,我很挣扎,我不明白下面的代码是否改变了状态或数据。

这是代码

let state = [];

const updateState = (state, data) => {
  return [...state, data];
}

state = updateState(state, 1);


console.log(state);

我想使用一个纯函数来接收状态和数据并更新原始状态。

这条线state = updateState(state, 1);对我来说就像一个突变,但我不确定。我在改变状态吗?

谢谢你的帮助。我正在尝试学习。

标签: javascriptimmutability

解决方案


是的,您的代码会在您认为的位置发生突变。updateState是一个纯函数,因为它没有副作用,不会改变任何东西,并且在给定相同输入的情况下始终具有相同的返回值,但重新分配state是一种突变。这也是像 Redux 这样的库在后台所做的,例如这里。请注意,重要的是当前状态并没有被改变,它被完全重新分配给由纯函数计算的新状态的值。JS 对于纯度和不变性来说并不是一种很好的语言,但是如果你的整个应用程序只是由函数和不可变数据组成(在边缘有一些 IO),那么就可能永远不需要重新分配或改变任何东西(另见这个问题和最佳答案)。


推荐阅读