js深淺拷貝

講到深淺拷貝,涉及到JavaScript的數據類型。js中的數據類型分爲基礎型和引用型。基礎型存儲在棧中,引用類型存儲在堆中。

基礎類型並沒有深淺拷貝之說,這裏所說的深淺拷貝針對的是引用類型數據而言(牢牢記住這句)。

通俗點講,區分深/淺拷貝,就是假設B複製了A,當修改A時,如果B也跟着變了,說明這是淺拷貝,如果B沒變,那就是深拷貝。

for..in循環遍歷所有可枚舉的屬性的鍵,包括繼承來的屬性的鍵。

Object.keys()返回所有自有可枚舉屬性的鍵。

Object.values()(ES7)返回所有可枚舉屬性的值。

Object.entries()(ES7)可返回所有可枚舉屬性的鍵和值。

實現深拷貝的方法:

1.遞歸

function deepCopy(obj){
    let objCopy = Array.isArray(obj)?[]:{};
    if(obj && typeof obj==="object"){
        for(key in obj){
            if(obj.hasOwnProperty(key)){
                if(obj[key]&&typeof obj[key] ==="object"){
                    objCopy[key] = deepCopy(obj[key]);
                }else{
                    //如果不是,簡單複製
                    objCopy[key] = obj[key];
                }
            }
        }
    }
    return objCopy;
}    
let a=[1,2,3,4],
    b=deepCopy(a);
a[0]=2;
console.log(a,b);

2.除了遞歸,我們還可以借用JSON對象的parse和stringify

function deepClone(obj){
    let _obj = JSON.stringify(obj),
        objClone = JSON.parse(_obj);
    return objClone
}    
let a=[0,1,[2,3],4],
    b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);

3.除了上面兩種方法之外,我們還可以借用JQ的extend方法。

let a=[0,1,[2,3],4],
    b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a,b);

4.該博客結合數組去重那篇博客,再去看看之前的自選功能博客,會發現有很大的優化空間!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章