【JS】深拷贝与浅拷贝的区别,实现的方法

如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。


怎么去实现???????????????


1.JSON方法实现

//_tmp和result是相互独立的,没有任何联系,有各自的存储空间。

let deepClone = function (obj) {

    let _tmp = JSON.stringify(obj);//将对象转换为json字符串形式

    let result = JSON.parse(_tmp);//将转换而来的字符串转换为原生js对象

    return result;

};

let obj1 = {

    weiqiujaun: {

        age: 20,

        class: 1502

    },

    liuxiaotian: {

        age: 21,

        class: 1501

    }

};

let test = deepClone(obj1);

console.log(test);

2.用for…in实现遍历和复制

function deepClone(obj) {

    let result = typeof  obj.splice === "function" ? [] : {};

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

        for (let key in obj) {

            if (obj[key] && typeof obj[key] === 'object') {

                result[key] = deepClone(obj[key]);//如果对象的属性值为object的时候,递归调用deepClone,即在吧某个值对象复制一份到新的对象的对应值中。

            } else {

                result[key] = obj[key];//如果对象的属性值不为object的时候,直接复制参数对象的每一个键值到新的对象对应的键值对中。

            }

        }

        return result;

    }

    return obj;

}

let testArray = ["a", "b", "c", "d"];

let testRes = deepClone(testArray);

console.log(testRes);

console.log(typeof testRes[1]);

let testObj = {

    name: "weiqiujuan",

    sex: "girl",

    age: 22,

    favorite: "play",

    family: {brother: "son", mother: "haha", father: "heihei"}

};

let testRes2 = deepClone(testObj);

testRes2.family.brother = "weibo";

console.log(testRes2);

3.利用数组的Array.prototype.forEach进copy


let deepClone = function (obj) {

    let copy = Object.create(Object.getPrototypeOf(obj));

    let propNames = Object.getOwnPropertyNames(obj);

    propNames.forEach(function (items) {

        let item = Object.getOwnPropertyDescriptor(obj, items);

        Object.defineProperty(copy, items, item);

    });

    return copy;

};

let testObj = {

    name: "weiqiujuan",

    sex: "girl",

    age: 22,

    favorite: "play",

    family: {brother: "wei", mother: "haha", father: "heihei"}

}

let testRes2 = deepClone(testObj);

console.log(testRes2);

4.浅拷贝(使用object.assign方法)


let target=[];

let testArr=[2,3,5,8];

Object.assign(target,testArr);

console.log(target);

testArr.push(8);

console.log("我是原来的"+target+",我是现在的"+testArr);

5、lodash函数库实现深拷贝

lodash很热门的函数库,提供了 lodash.cloneDeep()实现深拷贝 👉传送门https://www.lodashjs.com/

参考:听风是风

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容