这个问题出在“对象”的赋值上: 在JavaScript中,对象是按引用(不知道什么是引用的请自行百度)传值的,这就引出了今天我们要讨论的话题:深拷贝、浅拷贝:


浅拷贝现象:

var obj1 = {"a":"11", "aa":{"b":"22"}};
var obj2 = obj1;
console.log(obj1 === obj2);  //不明白 == 与 === 的区别的也请自行百度

>>> true

上面这个问题说明——obj1和obj2就是一个对象而非内容相同的两个对象,这就导致了,若是修改了obj2的值,obj1的值也会跟着改变:

obj2.a = "33";
console.log(obj2.a, ":", obj1.a);

>>> 33 : 33


与浅拷贝相对的就是深拷贝,这个就比较好理解了,他们是内容相同的两个不同的对象;实现深拷贝的方法:

方案一:使用ES6语法中的 Object.assign() 方法
方法缺点:只能实现一层的深拷贝,对于子对象还是浅拷贝(当然,你要是愿意用循环递归什么的来实现整体的深拷贝的话我也不好说啥)。

var obj1 = {"a":"11", "aa":{"b":"22"}};
var obj2 = Object.assign({}, obj1);
console.log(obj1===obj2, ":", obj1.aa===obj2.aa);

>>> false ":" true

方案二:先转成字符串再转回来
方法特点:实现简单,原理易懂。但是,只适用于JSON对象,对function来说就不好使了。不过,也能满足一般的需求了。

var obj1 = {"a":"11", "aa":{"b":"22"}};
var obj2 = JSON.parse(JSON.stringify(obj1));
console.log(obj1===obj2, ":", obj1.aa===obj2.aa);

>>> false ":" false



其他的方法我就不会了,有更高需求的大佬们请Google





– END    TIME:2018/12/11 19:42 –