天天看點

淺拷貝與深拷貝的差別,利用原生JavaScript實作深拷貝

淺拷貝與深拷貝概述:

1.淺拷貝隻是拷貝一層,更深層次對象級别隻拷貝引用;

2.深拷貝拷貝多層,每一級别的資料都會拷貝;

利用原生JS實作深拷貝

原生JS的資料類型包括值類型和引用類型:

對于值類型(undefined;string;number;boolean;symbol;),可以很友善的使用指派操作,

但對于引用類型(Array,Object),簡單的進行指派操作,指派得到的隻是位址,俗稱淺拷貝,如下:

const obj = {
    a: 13,
    b: { name: 'zhangsan', age: 13 },
    c: [1, 3, 4]
};
const obj2 = obj;
obj2.c[0] = 23;
console.log(obj.c[0]); //23
           

對obj2中的值修改也會更改obj中的值,是以就需要進行深拷貝操作,避免這種簡單指派操作帶來的影響,代碼如下:

const obj = {
    a: 13,
    b: { name: 'zhangsan', age: 13 },
    c: [1, 3, 4]
};
function deepClone(obj = {}) {
    //判斷值類型
    if (typeof obj !== 'object' || typeof obj == null) {
        return obj
    };
    //初始化result值
    let result;
    if (obj instanceof Array) {
        result = [];
    } else {
        result = {};
    };
    //進行指派操作
    for (let key in obj) {
        //判斷key是不是obj本身所含的屬性,保證key不是原型屬性
        if (obj.hasOwnProperty(key)) {
        	//遞歸
            result[key] = deepClone(obj[key]);
        }
    };
    return result;
}
const obj3 = deepClone(obj);
obj3.c[0] = 23;
console.log(obj.c[0]);//1
           

綜上,實作深拷貝有幾個注意點:

1.判斷值類型和應用類型
2.判斷是數組還是對象
3.遞歸
           

繼續閱讀