Javascript 不可变变量和纯函数更新状态

Javascript 不可变变量和纯函数更新状态,javascript,immutability,Javascript,Immutability,我正在学习不变性和纯函数。作为一个新手,我很挣扎,我不知道下面的代码是否会改变状态或数据 这是密码 let state = []; const updateState = (state, data) => { return [...state, data]; } state = updateState(state, 1); console.log(state); 我想使用一个纯函数来接收状态和数据并更新原始状态 此行state=updateState(state,1)对我来说

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

这是密码

let state = [];

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

state = updateState(state, 1);


console.log(state);
我想使用一个纯函数来接收状态和数据并更新原始状态

此行
state=updateState(state,1)对我来说就像是一种变异,但我不确定。我是在改变国家吗


谢谢你的帮助。我正在努力学习。

是的,您的代码会在您认为的地方完全改变状态
updateState
是一个纯函数,因为它不执行任何副作用,不进行任何变异,并且在给定相同输入的情况下始终具有相同的返回值,但重新分配
状态
是一种变异。例如,这也是像Redux这样的库在后台所做的工作。请注意,重要的是,当前状态并没有发生变化,而是完全重新分配给纯函数计算的新状态的值。JS在纯粹性和不变性方面不是一种很好的语言,但是如果你的整个应用程序只是由函数和不可变的数据组成(在边缘有一些IO),那么就可能永远不需要重新分配或修改任何内容()。

编写
const newState=updateState(oldState,1)
怎么样?这真的只是一个命名问题。是的,
state
变量的突变在本例中是不纯净的,但是重点应该放在
updateState
函数上-它的纯度才是真正重要的。非常感谢!但是,如果我使用状态来持久化数据,那该如何工作呢?第一次调用函数时,新状态应该有[1],下一次应该有1加上新的状态[1,2],依此类推。我不知道我是否表达得很好是的,你做得对。就像@Bergi说的,重要的是你计算新状态的方式是纯的。@Peter持久化数据(无论你的确切意思是什么)是一种副作用,最终不能只使用纯函数。因此,如果我想使用
state
存储数据,我不能使用纯函数,我必须对其进行变异,对吗?像
state.push(1)
然后
state.push(2)
etc等等!我以为我在变异。现在,我将尝试理解如何以功能的方式持久化数据。