js里面的深拷贝是针对引用数据类型才有的,对于基本数据类型则没有这种深拷贝与浅拷贝之分。因为基本数据类型是名和值都存储在栈内存里,而引用数据类型是名存储在栈内存,他的值则指向堆内存空间。
let arr1 = [1,2,3,4]
let arr2 = arr1
这里会将arr2和arr1共用一个堆内存指向,所以不管之后对两个数组
如何操作都是作用在同一个堆。这种也是我们所说的浅拷贝
那么如何对一个对象进行深拷贝呢?
方法一:运用JSON.stringify()与JSON.parse(),这种比较简单,有兴趣可以百度
方法二:接下来我要介绍的是另一个方法,可以对传入的数组或者对象进行深拷贝,通过自己写的函数功能可以实现深拷贝、
let hardClone = function fnHardClone(obj) {
// 定义两个变量,一个是返回的对象result,一个是对象的key
let result = typeof obj.slice === "function" ? [] : {},
key;
// 上面是根据传入的obj做一个三元表示式判断
//,如果他有slice方法,则证明我们要获得的result是个数组
if (obj && typeof obj === "object") {
for (key in obj) {
//遍历这个obj
if (obj[key] && typeof obj[key] === "object") {
result[key] = hardClone(obj[key]);
// 如果这个obj[key]里面的值是一个obj对象,要继续遍历,所以用递归
} else {
result[key] = obj[key];
}
}
return result;
}
return obj;
};
var arry1 = [1, 2, 3, 4];
var arry2 = hardClone(arry1);
arry1.shift();
console.log(arry1);
console.log(arry2);
方法三:利用展开运算符‘…’实现数组或对象的深拷贝。
let arr1 = [1, 2, 3];
let arr2 = [...arr1];
console.log(arr1, arr2);
console.log(arr1 === arr2);
// 输出结果为
/* [ 1, 2, 3 ] [ 1, 2, 3 ]
false */
let objA = { a: 1, b: 2 };
let objB = { ...objA };
console.log(objA, objB);
console.log(objA === objB);
//输出结果为
/* { a: 1, b: 2 } { a: 1, b: 2 }
false */
通过以上代码的演示,可以很明显的看出arr2是arr1的深拷贝,objB是objA的深拷贝。
好了,以上就是我要介绍的方法,如果对你有帮助的话记得三连,感谢。
请允许自己写出垃圾,否则,你连垃圾都写不出来。