Redux 中 Immer 中 Object.assign() 的意外行为

我正在使用 redux-starter-kit(其中包括用于可变更新的 Immer 库),但由于某种原因,这个减速器不起作用:


reInitializeState(state, action) {

        state = Object.assign({}, initialState);

        state.someProperty = true; // this does not get set

    },

但这个确实:


reInitializeState(state, action) {

        Object.assign(state, initialState);

        state.someProperty = true; // this does

    },

我希望他们做同样的事情。这里发生了什么?


慕神8447489
浏览 197回答 3
3回答

素胚勾勒不出你

使用 Immer,您可以就地改变对象以创建下一个不可变副本。在第一个示例中,因为state作为参数传入,执行:state = Object.assign({}, initialState);重新分配state给一个新对象,因此someProperty在该新对象上的设置不会导致任何更改——您必须对参数本身进行变异。在第二个示例中,您不会重新分配state给其他东西,因此调用state.someProperty和修改它会修改原始状态对象。

蝴蝶刀刀

你在这里做什么:state = Object.assign({}, initialState);正在复制initialState到一个新对象中,并丢弃state. 您应该分配给statenot {},并将结果分配给state。state = Object.assign(state, initialState);

临摹微笑

重新分配变量本身几乎不会对其他地方产生任何影响。如果您将变量作为参数传递,然后重新分配该变量,然后函数结束,函数之外的任何内容都不会看到任何更改。相似地:let someVar = 'foo';function reassign(str) {  str = 'bar';}reassign(someVar);console.log(someVar);在上面的函数内部重新分配不会做任何事情,因为重新分配不会改变someVar指向的外部绑定。你的第二个片段:reInitializeState(state, action) {    Object.assign(state, initialState);    state.someProperty = true; // this does},在这里,您正在改变state作为参数传递的原始对象,因此可以在函数外部看到更改。在另一个片段中,您正在改变一个全新的 object,该对象在脚本的其他地方无法看到,并继续进行垃圾收集。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript