拷贝(Copy),都是基于引用类数据来说的,基本数据类型直接在Heap中直接拷贝一份,引用数据类型分为浅拷贝和深拷贝;

        虽然现在有很多数据库,直接封装好了一部分代码,我们直接引用就可以,比如Lodash,它的代码封装比较完善,但是我们还是要简单了解下拷贝的知识;

浅拷贝:复制的是一个引用地址,如果地址内的内容发生改变,所有的内容都会改变;

深拷贝:在内存中开辟出一块地盘,存放复制过来的对象;

例子我就不写了,直接封装函数,然后调用就可以了,有浅拷贝和深拷贝的几种写法,如有错,请指正,也不是我的原创,毕竟只是知识点,但是不知道转载谁的,所以如有侵权,请告知,谢谢

方法一: $qian();

function $qian(obj) {

    let newObj = {};

    for (let a in obj) {

        if (obj.hasOwnProperty(a)) {

            newObj[a] = obj[a];

        };

    };

    return newObj;

};

方法二:$copy(a) 也是浅拷贝的一种

function $copy (obj){

        return Array.isArray(obj) ? [...obj] : {...obj}

        // return obj instanceof Array ? [...obj] : {...obj}

}

方法三 Object.assign(); 也是浅拷贝的一种

   function copyAssign(obj) {

            return obj instanceof Array ? Object.assign([],obj) : Object.assign({},obj);

          }

方法四 JSON.parse(JSON.stringify());深拷贝的一种,通过JSON的转换,变成一个新的对象

 function copyJSON(obj) {

            return JSON.parse(JSON.stringify(obj))

          }

方法五 递归的封装Copy   深拷贝的一种

 function deepCopy1(obj) {

            const getType = (obj) => {

                if (typeof obj !== 'object') {

                    return obj;

                };

                return Object.prototype.toString.call(obj).slice(8, -1);

            };

           let newObj = getType(obj) == 'Array' ? [] : {};

            for (let a in obj) {

                newObj[a] = typeof obj[a] === 'object' ? deepCopy1(obj[a]) : obj[a];

            };

            return newObj;

        }

方法六 ;就是外部引用lodash文档,使用封装好的copy刚能函数

如果还有其他的方法,欢迎大家来交流

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐