实现深拷贝

56 阅读1分钟

深拷贝函数

        function deepClone(newObj, obj) {
            if (obj instanceof RegExp) return new RegExp(obj)
            if (obj instanceof Date) return new Date(obj)
            if (obj === null) return null
            for (let key in obj) {
                value = obj[key]
                if (value instanceof Array) {        //如果对象中的值为一个数组,因为js中数组也是一种对象,所以放在上面
                    newObj[key] = []               // 初始化数组
                    deepClone(newObj[key], value)   //递归实现拷贝
                }
                else if (value instanceof Object) { //如果对象中的值为一个对象
                    newObj[key] = {}              // 初始化对象
                    deepClone(newObj[key], value)  //递归实现拷贝
                }
                else {
                    newObj[key] = value          //如果对象中的值为基本数据类型,直接赋值给新对象
                }
            }
        }

上面这个实现方法会有一个问题,会出现循环引用,比如下面这段代码:

        let obj = {
            name: 'obj'
        }
        let cc = {
            name: 'newObj',
            age: 18,
            arr: [14,15],
            family: obj
        }
        obj.a=newObj
        deepClone(a,cc)

image.png
超出最大堆栈Maximum stack exceeded, 原因是newObj里包含obj,而obj也包含newObj,这样的话就造成了deepClone一直递归调用,循环引用

解决方法: