前端面试题整理——深拷贝

    const obj = {
        a: 100,
        b: {
            b1: [1, 2, 3],
            b2: 'string'
        },
        c: ['a', 'b', 'c']
    }

    /*
    *  没做深拷贝的效果
    const obj2 = obj
    obj2.a = 200
    obj2.b.b2 = 'abc123'
    obj2.c[0] = 'aa'
    console.log(obj)
    console.log(obj2)

    obj2修改的内容会影响obj的内容,因为他们修改的都是同一个堆内容
    * */

    const obj2 = deepClone(obj);
    obj2.a = 200
    obj2.b.b2 = 'abc123'
    obj2.c[0] = 'aa'
    console.log(obj)
    console.log(obj2)

    /**
     * 深拷贝
     * @param {Object} obj 要深拷贝的对象
     * */
    function deepClone(obj = {}) {
        // obj如果不是引用类型,或者是null,直接返回
        if (typeof obj !== 'object' || obj == null) {
            return obj
        }
        // 初始化返回结果
        let result;
        if (obj instanceof Array) {
            result = []
        } else {
            result = {}
        }
        // 遍历obj
        for (let key in obj) {
            // 保证key不是原型的属性
            if (obj.hasOwnProperty(key)) {
                // 递归调用
                result[key] = deepClone(obj[key])
            }
        }
        return result
    }

考点:

不同类型使用内存堆栈的情况

你可能感兴趣的:(前端面试题整理——深拷贝)