JavaScript 实现深拷贝

浅拷贝和深拷贝的区别:

基础类型两者一致,如果是引用类型,则不同。
浅复制会导致复制前后,指向同一块内存地址,复制前后相互影响;
深复制是开辟一块新的内存地址,复制前后互不影响。
举个例子,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝(同源,一动全动),如果B没变,那就是深拷贝(不同源,互不影响)。

下面介绍几种实现深拷贝的方法

(这里的拷贝仅限于简单的对象,不包含含有方法的对象,这里埋个坑,考虑一下含有方法的情况)

1.递归的方式实现深拷贝

       function deepCopy(obj) {
            let result = Array.isArray(obj) ? [] : {};
            for (let key in obj) {
                if (obj.hasOwnProperty(key)) {
                    if (typeof obj[key] === 'object') {
                        result[key] = deepCopy(obj[key]);   //递归复制
                    } else {
                        result[key] = obj[key];
                    }
                }
            }
            return result;
        }
        let items = ['11', '22', '33', '44'];
        let itemsCopy = deepCopy(items);
        itemsCopy[0] = 'aaa';
        console.log('items--->' + items);//items--->11,22,33,44
        console.log('itemsCopy--->' + itemsCopy);//itemsCopy--->aaa,22,33,44

2.通过JSON对象实现深拷贝

       let items = ['11', '22', '33', '44'];
        let _obj = JSON.stringify(items);
        let itemsCopy = JSON.parse(_obj);
        itemsCopy[0] = 'aaa';
        console.log('items--->' + items);//items--->11,22,33,44
        console.log('itemsCopy--->' + itemsCopy);//itemsCopy--->aaa,22,33,44

3.通过Object.assign实现深拷贝

当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝

        let items = ['11', '22', '33', '44'];
        let itemsCopy = Object.assign([], items);
        itemsCopy[0] = 'aaa';
        console.log('items--->' + items);//items--->11,22,33,44
        console.log('itemsCopy--->' + itemsCopy);//itemsCopy--->aaa,22,33,44

注意:Object.assign实现深拷贝,只深复制了基本类型数据类型,不是真正意义的深复制

        let items = ['11', '22', '33', ['44','55']];
        let itemsCopy = Object.assign([], items);
        itemsCopy[3][0] = 'bbb';
        console.log(items);
        console.log(itemsCopy);

如图,拷贝的对象最后一项是数组对象,使用Object.assign拷贝,最后一项就是浅拷贝了。

Object.assign实现拷贝慎用!!!

4.其他第三方库实现的拷贝

(1)通过jQuery的extend方法实现深拷贝
(2)lodash函数库实现深拷贝

你可能感兴趣的:(JavaScript 实现深拷贝)