問題:
// 如果是基本數據類型
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;
}
依次遍歷,如果是基本數據類型那麼就複製,不是基本數據類型那麼就繼續遍歷。