Javascript 使用Object.assign返回新的未变异状态&;洛达斯合并函数?

Javascript 使用Object.assign返回新的未变异状态&;洛达斯合并函数?,javascript,redux,react-redux,lodash,mutation,Javascript,Redux,React Redux,Lodash,Mutation,只是遇到了一些我不明白的事情。它是关于redux state+lodash\uux.merge函数的 这不起作用: const newState = Object.assign({}, state); const merge = { active: { userId: nextUserId } }; return _.merge(newState, merge); const newState = Object.assign({}, state

只是遇到了一些我不明白的事情。它是关于redux state+lodash\uux.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);
而这确实有效:

  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);
vs:


我似乎不明白为什么这里会有不同<代码>.\uMERGE是可变的,所以最好是“突变”一个新创建的对象,而不是状态本身-而是在第一种情况下,我用
对象创建一个新对象。分配
并将其作为新状态返回。我从未有过变异的状态。还是我?这里的问题是什么?

对象。赋值创建一个浅层副本,因此任何比级别1更深的属性仍然引用原始状态

这不起作用:

newState
是将递归复制
merge
对象属性的目标对象,由于
newState
仍然引用原始状态,因此任何变异最终都会变异原始状态

鉴于这确实有效:


{}
是目标对象,其中将递归复制
newState
merge
对象中的属性,因为
{}
不涉及原始状态,因此任何突变最终都不会影响原始状态

uppps阅读本文,我觉得这可能与制作了
newState
const
有关……它与newState是const无关。将某个对象声明为常量不会对对象的行为方式产生任何影响,除非您尝试重新分配它,否则会抛出一个错误。顺便说一句,你仍然可以变异常量。
  return _.merge({}, newState, merge);