js 實現深深的拷貝

問題:

// 如果是基本數據類型
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;
}

 

依次遍歷,如果是基本數據類型那麼就複製,不是基本數據類型那麼就繼續遍歷。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章