JavaScript:a = Object.assign({},a,{k:v})会变异吗?

时间:2018-01-03 17:39:49

标签: javascript reactjs redux side-effects mutation

我有一个对象存储为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;

这在简单的测试中工作正常,但我想确保这实际上不执行任何突变。我很感激其他人可以就这个问题提出的任何见解!

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

要非常小心,如果对象是深层嵌套的,则指定mutate对象。并且它已写在文档中,因此您应该检查数据结构。

  

对于深度克隆,我们需要使用其他替代方法,因为   Object.assign()复制属性值。如果源值是a   引用一个对象,它只复制该引用值。   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)