javascript實現數組或對象的深拷貝

js實現深拷貝有兩種方法

第一(簡單粗暴):面試

let arr = [1, {a: 2}];
let copyArr = JSON.parse( JSON.stringify(arr) );
console.log(copyArr )  // [1, {a: 2}]
arr[1].a = 3;
console.log(copyArr )  // [1, {a: 2}]
copyArr[1].a = 5;
console.log(arr)       // [1, {a: 2}]

能夠看出來,改變原數組arr,並無對新數組copyArr產生影響;改變新數組copyArr也沒有對原數組arr產生影響;數組

第二(面試官大多數會問這種方法):code

let arr = [1, {a: 2}];

function deepCopy(arr) {
    let copyArr = (arr.constructor === Array) ? [] : {}; // 判斷是數組仍是對象
    for(let i in arr) {
        if(typeof arr[i] === 'object') {   // 判斷是值類型仍是引用類型
            copyArr[i] = deepCopy(arr[i]);  // 引用類型的話進行遞歸操做
        } else {
            copyArr[i] = arr[i];  // 值類型直接賦值
        }
    }
    return copyArr;
}

let copyArr = deepCopy(arr);
console.log(copyArr )  // [1, {a: 2}]
arr[1].a = 3;
console.log(copyArr )  // [1, {a: 2}]
copyArr[1].a = 5;
console.log(arr)       // [1, {a: 2}]

一樣:改變原數組arr,並無對新數組copyArr產生影響;改變新數組copyArr也沒有對原數組arr產生影響;對象

相關文章
相關標籤/搜索