链接:
浅拷贝
1.浅拷贝只是拷贝了栈中的内存地址,创建了一个新的对象。如果是属性是基本数据类型,那么拷贝的是属性的值:原对象改变,新对象不会跟着改变;如果拷贝的是内存地址(引用数据类型),那么会跟着改变
let a = ["a", "b", "c"];
let b = a;
b[0] = "1"; // 改变b数组的第一项为1,那么a数组的第一项也会跟着改变
console.log("a", a); // ['1', 'b', 'c']
console.log("b", b); // ['1', 'b', 'c']
深拷贝
复制原来的但不修改原来的对象,就用深拷贝,(深拷贝就是增加一个指针,并申请一个新的内存,并且让这个新增加的指针指向这个新的内存地址使用深拷贝,在释放内存的时候就不会像浅拷贝一样出现释放同一段内存的错误)
this.filterList = JSON.parse(JSON.stringify(this.filList));
// 先将数组转为字符串,再转为对象,就会形成一个新的对象。改变他,原来的就不会跟着改变
递归 适用于复杂数据类型
getnum() {
const obj1 = {
a: 1,
b: "xxxx",
like: {
city: "beijing",
},
list: ["a", "b", "c"],
};
let obj2 = this.clone(obj1);
obj2.like.city = "shenzhen";
obj2.a = 3;
console.log("obj1", obj1);
console.log("obj2", obj2);
},
clone(obj) {
// 先检测传入的obj是否为对象,或者空
if (typeof obj !== "object" || typeof obj == null) {
// 不是的话,直接return 基本数据类型
return obj;
}
let resnum;
// 定义类型 instanceof 判断数值类型 是否为数组
if (obj instanceof Array) {
resnum = [];
} else {
resnum = {};
}
for (let key in obj) {
// obj中是否真的存在key值
if (obj.hasOwnProperty(key)) {
// 使用递归 继续调用
resnum[key] = this.clone(obj[key]);
}
}
// return出去
return resnum;
},