javascript - 使用 Object.assign 和 lodashs _.merge 函数返回新的未突变状态?

标签 javascript redux react-redux lodash mutation

刚刚遇到一些我不明白的事情。这是关于 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);

{} 是目标对象,newStatemerge 对象的属性将被递归复制,并且由于 { 不涉及原始状态,因此任何突变最终都不会影响原始状态

关于javascript - 使用 Object.assign 和 lodashs _.merge 函数返回新的未突变状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57449401/

相关文章:

reactjs - 如何在 react 中将 react 钩子(Hook)对象从 index.js 传递到 axios 拦截器

javascript - React - 无法读取未定义的属性,尽管我在构造函数中绑定(bind)了该函数

javascript - 限制 Reducer 的结果

javascript - 一种阻止移动浏览器下载和显示图像的方法

javascript - Javascript插件读取条形码

javascript - 在 Redux-React Native 中使用 reducers 时导入/导出

javascript - React-Reudx : Actions must be plain objects. 使用自定义中间件进行异步操作

javascript - 将过滤后的 html 表数据下载到 csv 文件

javascript - Safari 上的 CSS 转换与其他浏览器相比起伏不定

javascript - 操作正在传递给状态对象,并且操作对象为空