刚刚遇到一些我不明白的事情。这是关于 redux state + lodashs _.merge 函数。
这不起作用:
const newState = Object.assign({}, state);
const merge = {
active: {
userId: nextUserId
}
};
return _.merge(newState, merge);
虽然这确实有效:
const newState = Object.assign({}, state);
const merge = {
active: {
userId: nextUserId
}
};
return _.merge({}, newState, merge);
不同的是最后一行:
return _.merge(newState, merge);
对比:
return _.merge({}, newState, merge);
我似乎不明白为什么这会有所不同? _.merge
是可变的,所以最好“改变”一个新创建的对象,而不是声明它自己 - 但是在第一种情况下,我正在创建一个新对象Object.assign
并将其作为新状态返回。我从来没有改变状态。还是我?这里有什么问题?
最佳答案
Object.assign
创建一个浅拷贝,所以任何比 level 1 更深的属性仍然引用原始状态,
This does not work: ?
return _.merge(newState, merge);
newState
是目标对象,其中 merge
对象的属性将被递归复制,并且由于 newState
仍然引用原始状态,所以任何突变最终都会改变原始状态
Whereas this does work:
return _.merge({}, newState, merge);
{}
是目标对象,newState
和 merge
对象的属性将被递归复制,并且由于 {
不涉及原始状态,因此任何突变最终都不会影响原始状态
关于javascript - 使用 Object.assign 和 lodashs _.merge 函数返回新的未突变状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57449401/