变异克隆对象,也变异原始对象 [Javascript]
Mutates a cloned object, mutates the original object too [Javascript]
我正在用 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' }
});
})
为什么会这样?为什么当我改变克隆的对象时,原始导入的对象也会改变?
Object.assign
只做浅层克隆。这意味着内部对象仍然指向原始对象。
要进行深度克隆,您可以使用 Lodash or immutability-helper。
您可以使用此功能复制对象属性:
const copyObj = (obj) => Object.keys(obj).map(k => [k, obj[k]]).reduce((m, [k, v]) => {m[k] = v; return m}, {})
我正在用 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' }
});
})
为什么会这样?为什么当我改变克隆的对象时,原始导入的对象也会改变?
Object.assign
只做浅层克隆。这意味着内部对象仍然指向原始对象。
要进行深度克隆,您可以使用 Lodash or immutability-helper。
您可以使用此功能复制对象属性:
const copyObj = (obj) => Object.keys(obj).map(k => [k, obj[k]]).reduce((m, [k, v]) => {m[k] = v; return m}, {})