一、浅拷贝:
浅拷贝只是拷贝一层,更深层次的对象级别的只会拷贝引用,因为对象类型的数值是以堆的形式存储的,而我们拷贝的只是指向那个堆的指针,不是对象类型的变量一般都是以栈的形式存储的,是以键值对的方式存储,例如:id:1 name:andy等等,如果这个变量类型是对象的话,那么栈里面只会存储一个指针,负责指向堆内存(也就是我们真正存放对象里面的数据比如{id:2,name:李四}等等),所以浅拷贝(拷贝对象叫b吧)会将被拷贝对象(叫a)的指针也拷贝下来,这样的话,你只要修改b里面对象类型的值就会影响到原对象a中的值,但是如果变量类型不是一个对象的话,则不会被影响。
常用的浅拷贝方法:
var obj = {
id:1,
....
goods:{
name:123,
....
}
};
var o = {};
①for (var k in obj){
//k是属性名,obj【k】是属性值
o[k] = obj[k];
}
②通过es6语法糖的assign方法:
Object.assign(o,obj);
Object.assign(拷贝对象,被拷贝对象);
二、深拷贝:
深拷贝拷贝多层,每一个级别的数据都会被拷贝
var obj = {
id:1,
....
goods:{
name:123,
....
}
};
var o = {};
①第一种方式:封装一个递归函数来实现:
function deepCopy(newobj,oldobj) {
for (var k in oldobj) {
//判断属性值的类型
//1.然后再获取属性值。
var item = oldobj[k];
//2.判断这个值是否是数组
if (item instanceof Array) {
newobj[k] = [];
deepCopy(newobj[k],item)
} else if (item instanceof Object){
//3.判断这个值是不是对象
newobj[k] = {}
deepCopy(newobj[k],item)
}else {
//4.属于简单类型,直接赋值,其实数组和对象在递归的时候只是确定了类型,最终传值的时候都需要走这一步,也就是说上面的函数只是将类型确定下来了,真正的传值操作还是在第四步进行的,殊途同归最终都会是简单类型的值拷贝。
newobj[k] = item;
}
}
}
注意数组和对象顺序不能更换!因为数组也属于对象!
②第二种方式:
只需要进行下列代码操作直接可以获得深拷贝后的值,平时最常用的了。
var newobj = JSON.parse(JSON.stringify(oldobj))