0.预备知识
在JavaScript中,基础类型值的复制是直接拷贝一份新的一模一样的数据,这两份数据相互独立,互不影响。而引用类型值(Object类型)的复制是传递对象的引用(也就是对象所在的内存地址,即指向对象的指针),相当于多个变量指向同一个对象,那么只要其中的一个变量对这个对象进行修改,其他的变量所指向的对象也会跟着修改(因为它们指向的是同一个对象)。
1.定义
深复制:真假猴王
浅复制:东施效颦
2.应用场景
Ⅰ. [ ].slice( ) : 浅复制出一个新数组,值传递,一个新的栈区,但是只有值,数组元素中对象的属性没有复制。
Ⅱ. 解构赋值: [...arr1] = arr0, {...map1} = map0. 深复制,只能初始化时使用,后续不可重新赋值。
Ⅲ. JSON方法: obj1 = JSON.parse(JSON.stringify(obj0)). 深复制,初始化及后续皆可使用,唯一的美中不足是在应对非纯数据的时候会出一点bug,不过好像有人解决了,以后再来更新。
Ⅳ. Map( ) : map1 = new Map( map0 ). 深复制,初始化及后续皆可使用
Ⅴ. 函数递归 :
function deepCopy(obj) {
var newobj = obj.constructor === Array ? [] : {};
if (typeof obj !== 'object') {
return obj;
} else {
for (var i in obj) {
if (typeof obj[i] === 'object'){ //判断对象的这条属性是否为对象
newobj[i] = deepCopy(obj[i]); //若是对象进行嵌套调用
}else{
newobj[i] = obj[i];
}
}
}
return newobj; //返回深度克隆后的对象
}
。。。待更新