使用 Object.assign & lodashs _.merge 函数返回新的未突变状态?
Returning new unmutated state with Object.assign & lodashs _.merge function?
刚刚遇到一些我不明白的事情。这是关于 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
是可变的,所以最好 "mutate" 一个新创建的对象,而不是声明自己 - 但 在第一种情况下,我正在创建一个新对象Object.assign
和 return 这是新状态。我从来没有改变状态。还是我?这里有什么问题?
Object.assign
创建一个浅拷贝,所以任何 属性 比级别 1 更深的仍然引用原始状态,
This does not work: ?
return _.merge(newState, merge);
newState
是目标对象,其中 merge
对象的属性将被递归复制,并且由于 newState
仍然指的是原始状态,所以任何突变最终都会改变原始状态
Whereas this does work:
return _.merge({}, newState, merge);
{}
是目标对象,其中 newState
和 merge
对象的属性将被递归复制,并且由于 {}
不引用原始状态所以任何突变最终都不会影响原始状态
刚刚遇到一些我不明白的事情。这是关于 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
是可变的,所以最好 "mutate" 一个新创建的对象,而不是声明自己 - 但 在第一种情况下,我正在创建一个新对象Object.assign
和 return 这是新状态。我从来没有改变状态。还是我?这里有什么问题?
Object.assign
创建一个浅拷贝,所以任何 属性 比级别 1 更深的仍然引用原始状态,
This does not work: ?
return _.merge(newState, merge);
newState
是目标对象,其中 merge
对象的属性将被递归复制,并且由于 newState
仍然指的是原始状态,所以任何突变最终都会改变原始状态
Whereas this does work:
return _.merge({}, newState, merge);
{}
是目标对象,其中 newState
和 merge
对象的属性将被递归复制,并且由于 {}
不引用原始状态所以任何突变最终都不会影响原始状态