SOURCE

const arr = [1,4,5,[6,7,8,{a:"a"}]];

// 浅拷贝
function clone(obj){
    if(!obj ||typeof obj !=="object") return;//如果是空的,或者不是对象,则返回
    // 根据obj的类型创建新对象的类型
    let newObj = Array.isArray(obj)?[]:{};
    // 遍历obj,并判断是obj的属性拷贝
    for(let i in obj){
        if(obj.hasOwnProperty(i)){
            newObj[i]=obj[i];
        }
    };
    return newObj;
}
// let arr1=clone(arr);
// arr1[0]=6;
// arr1[3][3].a=2;
// console.log(arr1);
// console.log(arr);
// 浅拷贝只拷贝对象的引用地址  因此两个对象公用同一个引用地址

// 实现深拷贝
function deepClone(obj){
    // 判断是不是空或者不是对象   返回
    if(!obj|| typeof obj !=="object") return;
    //根据obj判断是对象还是数组
    let newObj = Array.isArray(obj)?[]:{};
    // 遍历obj 并且判断是否是自身属性 不查找原型属性
    for(let i in obj){
        if(obj.hasOwnProperty(i)){
            newObj[i]= typeof obj[i] ==="object" ? deepClone(obj[i]):obj[i];
        }
    };
    return newObj;
}

// 使用深拷贝
let arr2=deepClone(arr);
arr2[0]=8;
arr2[3][3].a=6;
console.log(arr);
console.log(arr2);
console 命令行工具 X clear

                    
>
console