【问题标题】:Mutates a cloned object, mutates the original object too [Javascript]变异一个克隆的对象,也变异原始对象[Javascript]
【发布时间】:2017-12-16 00:15:20
【问题描述】:

我正在用 ES6 中的 Jest 为 React Components 编写一些测试。在一项测试中,我需要克隆一个导入的 json 并对克隆的对象进行变异,但是当我对克隆的对象进行变异时,原始对象也会发生变异!

import obj from './object.json';    // obj = { name: 'someName' }


describe('Testing a component', () => {

  it('Some testing', () => {
    const obj2 = Object.assign({}, obj);  //Clone the object
    obj2.name = 'otherName';  // Muatate the object

    console.log(obj); // { name: 'otherName' }
  });

})

为什么会这样?为什么当我对克隆的对象进行变异时,原始导入的对象也会发生变异?

【问题讨论】:

  • 做一个深度克隆

标签: javascript object testing jestjs mutation


【解决方案1】:

Object.assign 只进行浅层克隆。这意味着内部对象仍然指向原始对象。

要进行深度克隆,您可以使用Lodash 或immutability-helper。

【讨论】:

  • 我已经为此烦恼了很长时间 - 无法理解为什么 Object.assign 仍然允许原始变量的突变!谢谢你拯救了我的理智!
  • 我知道你需要做一个深拷贝,但是每次你想要映射多级 javascript 对象的时候不是很昂贵的操作吗?一旦有了数据树,浅拷贝就毫无用处。
【解决方案2】:

您可以使用此功能复制对象属性:

const copyObj = (obj) => Object.keys(obj).map(k => [k, obj[k]]).reduce((m, [k, v]) => {m[k] = v; return m}, {})

jsfiddle example

【讨论】:

    猜你喜欢
    • 2017-07-20
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2011-04-15
    相关资源
    最近更新 更多