js 對象深拷貝 ---- 基本數據類型和引用數據類型

總所周知,數據大致能夠分爲兩種數據類型,一種是基本數據類型,數據結構不是很複雜,單獨能夠存在內存中就能夠,而另外一種是複雜數據類型,也叫引用數據類型,例如數組和對象,是放在棧中存儲的。es6

 

基本數據類型是放在內存中的,不涉及深拷貝和淺拷貝,也能夠說基本數據類型都是深拷貝;數組

 

引用數據類型存儲比較複雜,例如var a=[1,2,3]  這句話的存儲就是首先在內存開闢一個空間,可是內存當中不能夠存儲這種複雜數據類型,因此要把這種結構放到棧當中。數據結構

棧至關於一個房間,而鑰匙存在內存當中,這就構成了一個存儲關係,淺拷貝var b=a簡單來講就是把這份鑰匙複製了一份,但內存當中的數據並無複製,因此若是改變a相應b也會改變函數

 

 

對象深拷貝的方法spa

1. es6 擴展運算符。code

 

 

2.  JSON.parse(JSON.stringify())
對象

注意:【這種方法有種缺陷,這種方法會忽略值爲function以及undefied的字段,並且對date類型的支持也不太友好。】blog

 

3. 函數封裝。繼承

var clone = function (obj) { 
    if(obj === null) return null 
    if(typeof obj !== 'object') return obj;
    if(obj.constructor===Date) return new Date(obj); 
    var newObj = new obj.constructor ();  //保持繼承鏈
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {   //不遍歷其原型鏈上的屬性
            var val = obj[key];
            newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除與函數名的耦合
        }
    }  
    return newObj;  
}; 

 

---------------------------------------內存

關於 Object.assign():

若是隻是複製對象的某一個屬性且屬性值爲基本數據類型,則能夠經過 Object.assign() 的方式進行相似深拷貝的操做;

若是要複製的對象的某一個屬性值爲引用數據類型,則 Object.assign() 只是對引用地址的複製,不能實現深拷貝

相關文章
相關標籤/搜索