【问题标题】:JavaScript: Will a = Object.assign({}, a, {k: v}) mutate a?JavaScript:a = Object.assign({}, a, {k: v}) 会改变 a 吗?
【发布时间】:2018-06-13 10:12:55
【问题描述】:

我有一个对象存储为 url 中的键值对作为查询参数。该对象的键可能会更改,我想使用该对象中的每个键、值对来更新 redux 应用程序中 state 对象的键、值对。我需要以一种不会改变state 对象的方式这样做,并且我目前正在尝试实现此目标,如下所示:

case 'LOAD_SEARCH_FROM_URL':
  let _state = Object.assign({}, state);
  const args = action.obj.substring(1).split('&');
  args.map((arg) => {
    const split = arg.split('=');
    _state = Object.assign({}, _state, {
      [split[0]]: JSON.parse( decodeURIComponent( split[1] ) )
    })
  })
  return _state;

这在简单的测试中运行良好,但我想确保这实际上没有执行任何突变。如果其他人可以就这个问题提供任何见解,我将不胜感激!

【问题讨论】:

    标签: javascript reactjs redux side-effects mutation


    【解决方案1】:

    不,Object.assign 只会改变目标(第一个参数),在您的情况下,它是一个新创建的空对象。不会修改源(所有后续参数)。

    【讨论】:

    • 阿门,非常感谢@Paulpro!我在发布问题后意识到这一点,但只要允许我(他们让你等待几分钟)就会接受这个。
    【解决方案2】:

    要非常小心,如果对象嵌套很深,则分配变异对象。它写在文档中,所以你应该检查你的数据结构。

    对于深度克隆,我们需要使用其他替代方法,因为 Object.assign() 复制属性值。如果源值是 引用一个对象,它只复制该引用值。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

    如果您有嵌套状态,例如 { a: 0 , b: { c: 0}},则更改后 redux 不会检测到这样的尝试:

    const mapStateToProps = state => {
      return {
        value: state[YOUR_REDUCER_NAME].a.b
      }
    }
    connect(mapStateToProps)(Component)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-28
      • 2021-10-03
      • 2014-08-20
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      相关资源
      最近更新 更多