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产生影响;

第二(面试官大多数会问这种要领):

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产生影响;

    原文作者:huangsh
    原文地址: https://segmentfault.com/a/1190000018359030
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞