JS 面试题之深拷贝(递归)

108 阅读1分钟

一、什么是深拷贝

深拷贝:复制的是值,把值给新的引用(意思是把值赋给新的变量)

二、手写深拷贝的逻辑

给函数传参,这个参数是我们要赋值的数据
首先声明一个新的变量,变量用来存我们拷贝的数据
判断这个参数的是否为数组,然后决定我们新声明的变量是数组还是对象
循环获取的参数,判断是否为引用类型
如果是基本类型就直接赋值给声明的变量
如果是引用类型就在调一遍函数本身,入参是这个引用类型(递归:自己调用自己)

三、代码示例

let obj = {
    name: 'Rebecca',
    age: 29,
    fn: function(){ console.log('深拷贝') },
    arr: [1, 2, 3],
    children: {child: 'son'},
    null: null,
    undefined: undefined
}
function deepClone(obj) {
    let newObj = []
    Array.isArray(obj)? newObj = [] : {}
    for(let key in obj){
        if(typeof obj[key] == 'Object'){
            newObj[key] = deepClone(obj[key])
        }else{
            newObj[key] = obj[key]
        }
    }
    newObj.test = '深拷贝'
    obj.test = '深拷贝222'
    console.log('newObj:', newObj)
    console.log('obj:', obj)
}
deepClone(obj)