對象淺拷貝深拷貝方法總結

對象複製方法總結
Object.assign Object.creat() jQuery.extend(object)
JSON.parse(JSON.stringfy()) 循環遞歸方法 原型鏈繼承方法

深拷貝是拷貝儲存在棧中的對象,
而淺拷貝是從內存中拷貝,
數據大體可以分爲兩種數據類型,
一種是基本數據類型,數據結構不是很複雜,單獨可以存在內存中就可以,
另一種是複雜數據類型,也叫引用數據類型,放在棧中存儲的,例如數組和對象

引用類型數據存儲是首先在內存開闢一個空間,但內存當中不可以存儲這種複雜數據類型,
所以要把這種結構放到棧當中,棧相當於一個密碼箱,而鑰匙存在內存當中,這就構成了一個存儲關係,

淺拷貝就是把這份鑰匙複製了一份,但內存當中的數據並沒有複製,所以如果改變a相應b也會改變
而深拷貝則需要在棧中在生成一個密碼箱,生成一把新鑰匙(鑰匙2),這樣深拷貝的兩種數值不會相互影響,
也可以說沒有任何關係了

方法一:JSON.parse(JSON.stringify(obj));
但是這種簡單粗暴的方法有其侷限性。當值爲undefined、function、symbol 、有NaN、Infinity和-Infinity、RegExp、Error對象,時間對象,會在轉換過程中被忽略或者異常

JSON.parse(JSON.stringfy())注意事項

方法二、遞歸通用拷貝函數

function clone(obj){
let newObj = Array.isArray(obj) ? [] : {};
    for(let key in obj){
	    let val = obj[key];
	    newObj[key] = typeof val == 'object'&& val !==null?clone(val):val;
	    // //clone(val)遞歸複製
	    //這裏也沒有判斷是否爲函數,因爲對於函數,我們將它和一般值一樣處理
    }
return newObj ;
}

方法三、Object.assign({},obj)

var obj = {a:1,b:2}  
var newObj = Object.assign({}, obj); 

在這裏插入圖片描述

方法四、jq中,$.extend({},obj)方法、jQuery.extend(object)方法
概述:
 擴展jQuery對象本身,用來在jQuery命名空間上增加新函數。

var obj = {
    x: 1,
    y: {
        a: 1,
        b: 0,
        c: [1, 2, 3]
    }
};
var obj2 = $.extend({}, obj);
console.log(obj2 === obj) //false 
console.log(obj2);

在這裏插入圖片描述
方法五. Object.create()方法
 複製對象存在於Object原型prototype中

var obj = {
    x: 1,
    y: {
        a: 1,
        b: 0,
        c: [1, 2, 3]
    }
};

var obj2 = Object.create(obj);
console.log(obj2 == obj); //false
console.log(obj2);

在這裏插入圖片描述
 深拷貝, 就是遍歷那個被拷貝的對象。判斷對象裏每一項的數據類型。如果不是對象類型, 就直接賦值, 如果是對象類型, 就再次調用遞歸的方法去賦值。

方法六. 原型鏈繼承方法

function Father() {
    this.say = "hi";
    this.fn = function () {
        return this.say;
    }
}
Father.prototype.eat = function () {
    console.log('喫');
}
function Son() {
    this.play = function () {
        console.log('play game');
    }
}

//通過原型來繼承父類的公共屬性

Son.prototype = new Father();
var s = new Son();
console.log(s);
console.log(s.say); //hi
console.log(s.fn()); //hi

在這裏插入圖片描述

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