Javascript 不应该';t Redux';是否返回state对象的副本?

Javascript 不应该';t Redux';是否返回state对象的副本?,javascript,redux,Javascript,Redux,我目前正潜入Redux水域,自从我了解到减速机的概念是多么简单之后,我不得不说我真的很兴奋 然而,我在标题上提出的问题让我感到奇怪 既然state对象的不变性是Redux的核心支柱,那么该方法不应该返回currentState的副本,这样它就不会暴露于环境中,因此就不可能对其进行修改了吗?我认为您将存储及其包含的状态与组件的状态混淆了。 它们是两个不同的概念。 当您调用getState()时,您将获得“this”组件的状态;显然你不应该修改它;但是,您可以使用setState()修改它,这将触发

我目前正潜入Redux水域,自从我了解到减速机的概念是多么简单之后,我不得不说我真的很兴奋

然而,我在标题上提出的问题让我感到奇怪


既然state对象的不变性是Redux的核心支柱,那么该方法不应该返回
currentState
的副本,这样它就不会暴露于环境中,因此就不可能对其进行修改了吗?

我认为您将存储及其包含的状态与组件的状态混淆了。 它们是两个不同的概念。 当您调用getState()时,您将获得“this”组件的状态;显然你不应该修改它;但是,您可以使用setState()修改它,这将触发组件的重新绘制。 相反,当您在reducer中并且某个操作导致reducer更改状态时,返回的状态必须始终是新对象。

这里有两个原因:1)在适当的Redux应用程序中,您永远不应该尝试直接更改状态,因此
getState()
结果只能通过getter使用,因此,没有必要在复制上浪费时间和周期;2) 事实上,以正确的方式复制它并不是那么容易。引用以下文件中的相关讨论:

你必须分配一个深度对象才能真正摧毁所有 我们不想这样做,因为你不能这样做 比较您的状态树的特定部分是否发生了更改,即 通过shouldComponentUpdate在React中非常有用


不过,人们可能会认为使用
对象.freeze()
覆盖检索到的状态作为保护措施(防止在其他地方对这样的对象进行变异)是有益的。然而,过多地传递结果状态很少是一种好的模式(如中所述)。

相关:@raina77ow我认为这两个问题关系不大,但它们是相关的,因为如果不理解“某物”是如何使用的,就不可能理解某物为何以这种或那种方式运行
getState
结果只能通过getter使用,不应修改;复制整个对象只会浪费时间和周期。@raina77好的,这很有启发性。同样相关:。我想你可能误解了我的问题。我说的是
存储
对象的
.getState()
。使用
redux.createStore()创建的