javascript的一切實例都是對象,只是對象之間稍有不同,分為基本類型和引用類型。 基本類型對象指的是字元串(String)、數值(Number)、布爾值(Boolean),引用類型對象指的是數組(Array)、對象(Object)、函數(Function)。 這兩類數據的引用有差別。普通對象存 ...
javascript的一切實例都是對象,只是對象之間稍有不同,分為基本類型和引用類型。 基本類型對象指的是字元串(String)、數值(Number)、布爾值(Boolean),引用類型對象指的是數組(Array)、對象(Object)、函數(Function)。
這兩類數據的引用有差別。普通對象存儲的是對象的實際數據,而引用對象存儲的是對象的引用地址,而把對象的實際內容單獨存放,因為引用對象通常比較龐大,這是數據開銷和記憶體開銷優化的手段。 就像對象的原型一樣,也是同一個概念。對象的原型也是引用對象,把原型的方法和屬性放在單獨記憶體當中,而對象的原型鏈則指向這個記憶體地址。
但有時我們需要的並不是指向記憶體區域的指針,而是記憶體中整個數據的備份(因為不想改動原數據)。不同的引用類型備份方法並不相同,於是我們對此封裝了統一的深度複製介面。
1 function deepCopy(source) { 2 var result = {}; 3 for (var key in source) { 4 var type = Object.prototype.toString.call(source[key]); 5 switch (type) { 6 case "[object Number]": 7 case "[object String]": 8 result[key] = source[key]; 9 break; 10 case "[object Array]": 11 result[key] = source[key].slice(0); 12 break; 13 default: 14 result[key] = deepCopy(source[key]); 15 } 16 } 17 return result; 18 }
這裡我們遍歷了source對象的屬性,使其劫持js對象原型的類型判別方法,當其是基本類型時直接賦值,是引用類型的數組類型時調用slice方法 截取整個數組(該方法返回的即時原數組備份),當其是其他對象時嵌套執行該函數。最終得到整個對象的備份。