使用 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);

{} 是目标对象,其中 newStatemerge 对象的属性将被递归复制,并且由于 {} 不引用原始状态所以任何突变最终都不会影响原始状态