總所周知,數據大致能夠分爲兩種數據類型,一種是基本數據類型,數據結構不是很複雜,單獨能夠存在內存中就能夠,而另外一種是複雜數據類型,也叫引用數據類型,例如數組和對象,是放在棧中存儲的。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() 只是對引用地址的複製,不能實現深拷貝