1、直接赋值
把一个对象a赋值给一个对象b,相当于让对象b的地址指向对象a的地址。所以,他们实际上是同一个对象。此时,修改对象b里的值,对象a里对应的值也会跟着改变(不管该值是对象属性还是非对象属性)。例如:
2、浅拷贝
ES6中浅拷贝方法:
var b = {};
Object.assign(b, a);
或者:
var b = { ...a };
把一个对象a浅拷贝给一个对象b。
1、修改对象b里的非对象属性值,对象a里对应的非对象属性值不受影响;
2、修改对象b里的对象属性值,对象a里对应的对象属性值也会跟随着被修改;
3、深拷贝
深拷贝,即拷贝一个一模一样的对象,但是新对象跟原对象不再共享内存。所以修改新对象的对象属性值或非对象属性值,都不会影响原对象。
深拷贝方法实现: 利用 JSON.stringify() 方法将对象a转化成json字符串,再利用JSON.parse() 方法将json字符串转成对象b即可。如:
注意:
由于JSON.stringify()需遵守JSON序列化规则:
1、原对象中如果含有Date对象,JSON.stringify()会将其变为字符串,之后并不会将其还原为日期对象。
2、原对象中如果含有RegExp对象,JSON.stringify()会将其变为空对象;
3、属性中含有NaN、Infinity和-Infinity,则序列化的结果会变成null;
4、如果属性中有函数,undefined,symbol则经过JSON.stringify()序列化后的JSON字符串中这个键值对会消失,因为不支持。
这个时候就只能用下面这样的笨方法了: