问题:
// 如果是基本数据类型
let a = 1;
let b = a;
a = 2;
console.log(a); // 2
console.log(b); // 1
// 如果是引用类型
let array = [1,3,2];
let array1 = array;
array = [1]
console.log(array); //[1]
console.log(array1) // [1]
问题是:在引用类型中,我们只是想要改变 array的值,并没有想要改变array1 的值,但是array1 的值也跟着一起改变了
怎么回事:因为引用类型在内存中只存在一份,无论你修改了哪一个引用,都会影响到所有的引用。
怎么解决:https://www.jianshu.com/p/f4329eb1bace
这位大哥列举出了几种思路,最后得出一个比较完善的方法。
export function deepCopy(target){
// 定义一个变量
let result;
//如果当前需要深拷贝的是一个对象的话
if (typeof target === 'object'){
//如果是一个数组的话
if (Array.isArray(target)) {
result = []; // 将result赋值为一个数组,并且执行遍历
for (let i in target) {
//递归克隆数组中的每一项
result.push(deepClone(target[i]));
}
// 判断如果当前的值是null的话;直接赋值为null
} else if(target===null) {
result = null;
// 判断如果当前的值是一个RegExp对象的话,直接赋值
} else if(target.constructor===RegExp){
result = target;
}else {
// 否则是普通对象,直接for in循环,递归赋值对象的所有值
result = {};
for (let i in target) {
result[i] = deepClone(target[i]);
}
}
// 如果不是对象的话,就是基本数据类型,那么直接赋值
} else {
result = target;
}
// 返回最终结果
return result;
}
依次遍历,如果是基本数据类型那么就复制,不是基本数据类型那么就继续遍历。