一、征象:直接用=
的体式格局把一个对象赋值给另一个对象,会致使修正新对象时,原对象也发生变化
var obj1 = {'name': '1111'};
var obj2 = obj1;
obj2.name = '2222';
console.log(obj1.name); //'2222'
二、缘由:JavaScript 中对象的赋值是默许援用赋值的(两个对象指向雷同的内存地址)
三、解决要领: JSON.parse(JSON.stringify(obj))
// 运用 Object.assign() 要领复制对象
let obj1 = { a: 0 , b: { c: 0}};
let obj2 = Object.assign({}, obj1);
console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
obj2.a = 2;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}}
obj2.b.c = 3;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}}
- 此要领也有不足之处:当修正
obj2.b.c
的值时,原对象obj1.b.c
也随着发生了变化,Object.assign()
只是让对象里第一层的数据没有了关联性,然则对象内的对象则跟被复制的对象有着关联性的。 - 最终解决方案:
JSON.parse(JSON.stringify(obj))
var function cloneObjectFn (obj){ // 对象复制
return JSON.parse(JSON.stringify(obj))
}
var obj1={a:2,b{c:0}}
var obj2=cloneObjectFn(obj1)
console.log(obj2) // {a:2,b{c:0}}