間歇性筆記——淺拷貝與深拷貝

daibin0809發表於2019-04-12

clone&cloneDeep

關於淺拷貝與深拷貝的一些筆記---

淺拷貝

  • 直接賦值;
    • 任何操作都會影響原陣列;
    let obj2 = obj1;
    複製程式碼
  • Object.assign;
    • 拷貝屬性值,假如屬性值是一個物件的引用,那麼也會指向那個引用;
    let obj2 = Object.assign({},obj1);
    複製程式碼
  • Array.prototype.concat();
    • 合併多個陣列;
    • 拷貝規則同Object.assign;
    let arr2 = arr1.concat(...arr);
    複製程式碼
  • Array.prototype.slice();
    • 提取陣列;
    • 引數(可選):startIndex,endIndex(與索引值一致);
    • 拷貝規則同Object.assign;
    let arr2 = arr1.slice(start,end);
    複製程式碼
  • 擴充套件運算子(...);
    • 拷貝規則同Object.assign;
    let obj2 = {obj1} or [...obj1];
    複製程式碼
  • lodash(_.clone());
    • 拷貝規則同Object.assign;
    let obj2 = _.clone(obj1);
    複製程式碼

深拷貝

  • JSON.parse(JSON.stringify());
    • 不能拷貝函式;
    let obj2=JSON.parse(JSON.stringify(obj1));
    複製程式碼
  • 遞迴賦值;
    • 額額額...函式是什麼---
    function deepClone(obj){
        let objClone = Array.isArray(obj)?[]:{};
        if(obj && typeof obj==="object"){
            for(key in obj){
                //判斷是否為自身屬性
                if(obj.hasOwnProperty(key)){
                    //判斷ojb子元素是否為物件,如果是,遞迴複製
                    if(obj[key]&&typeof obj[key] ==="object"){
                        objClone[key] = deepClone(obj[key]);
                    }else{
                        //如果不是,簡單複製
                        objClone[key] = obj[key];
                    }
                }
            }
        }
        return objClone;
    }
    複製程式碼
  • lodash(_.cloneDeep());
    let obj2 = _.cloneDeep(obj1);
    複製程式碼

相關文章