深拷贝
什么是深拷贝?
深拷贝:主要是将另一个对象的属性值拷贝过来之后,另一个对象的属性值并不受到影响,因为此时它自己在堆中开辟了自己的内存区域,不受外界干扰。
浅拷贝:将原对象的引用直接赋给新对象,新对象只是原对象的一个引用,而不复制对象本身,新旧对象还是共享同一块内存
一、堆栈和数据类型
在js中,数据类型分为两种,基本类型和引用类型。基本类型指的是简单的数据段,而引用类型指的是那些可能由多个值构成的对象。js中有五种基本数据类型number,string,boolean,null,undefined,他们的值被以键值对的形式保存在栈中,引用类型存在堆里。
二、实现深拷贝
1.递归法 for…in…法
arr=[100, [{a : 'hello'}, {b : "world"}], { c: "123456789" }];
//判断修改的是不是'object'或者null,如果不是 object 或者 null 那么直接返回
function deepClone(obj = {}) {
if (typeof obj !== 'object' || obj == null) {
return obj;
}
let result;
//判断上面下来的obj是不是数组 用instanceof来检测 因为是数组应用类型
obj instanceof Array?result=[]:result={}
for (var item in obj) {
//查找一个对象是否有某个属性
if (obj.hasOwnProperty(item)) {
// 递归调用
result[item] = deepClone(obj[item])
}
}
return result;
}
let arr1=deepClone(arr);
arr1[1][0].a='vue'
arr1[0]=99
console.log('原数组',arr)
console.log('新数组',arr1)
2.JSON.对象的方法实现
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}
var a = {
name: "zjam",
obj: {
am: "zaofnd",
dvd: "ddddd",
},
};
var b = deepClone(a);
a.obj.am = "早上";
console.log(a);
console.log(b);
3. concat()
concat() 对数组进行深拷贝
let arr = [1, 2, 3, 4, 5, 6];
let arr2 = arr.concat();
arr2[0] = 'Lisa';
arr2[1] = '女';
console.log('arr', arr); // [1, 2, 3, 4, 5, 6]
console.log('arr2', arr2); // ["Lisa", "女", 3, 4, 5, 6]