JavaScript數組及非數組對象的深淺克隆詳解原理
什麼是淺克隆、深克隆
淺克隆:直接將存儲在棧中的值賦值給對應變量,如果是基本數據類型,則直接賦值對應的值,如果是引用類型,則賦值的是地址。
深克隆:將數據賦值給對應的變量,從而產生一個與源數據不相幹的新數據(數據地址已變化)。即對象各個層級的屬性。
JavaScript中基本數據類型使用符號“=”可以進行克隆,引用數據類型使用符號“=”隻是改變瞭變量的指向,並沒有進行真正的克隆操作。
1.對數組進行克隆
1.1 淺克隆
使用for循環進行淺克隆。
var arr1 = ['demo', 1, 2]; var arr2 = []; // 數組的淺克隆 for (var i = 0; i < arr1.length; i++) { arr2[i] = arr1[i]; } console.log(arr2); console.log(arr1 == arr2);
輸出結果:
Array(3)0: “demo”1: 12: 2length: 3[[Prototype]]: Array(0)
false
1.2 深克隆
使用遞歸進行深克隆。
function deepClone(o) { var result = []; for (var i = 0; i < o.length; i++) { result.push(deepClone(o[i])); } return result; }
2.對非數組對象進行克隆
2.1 淺克隆
使用for循環進行淺克隆。
var obj1 = { a: 1, b: 2, c: 3, d: [4, 5, { e: 'demo' }] }; var obj2 = {}; // 對象的淺克隆 for (var i in obj1) { obj2[i] = obj1[i]; } console.log(obj2); console.log(obj1 == obj2);
輸出結果:
{a: 1, b: 2, c: 3, d: Array(3)}
false
2.2 深克隆
使用遞歸進行深克隆。
function deepClone(o) { var result = {}; for (var i in o) { result[i] = deepClone(o[i]); } return result; }
3.整合深克隆函數
var obj1 = { a: 1, b: 2, c: 3, d: [4, 5, { e: 'demo' }] }; var arr1 = ['demo', 1, 2]; // 深克隆 function deepClone(o) { if (Array.isArray(o)) { // 是數組 var result = []; for (var i = 0; i < o.length; i++) { result.push(deepClone(o[i])); } } else if (typeof o == 'object') { // 非數組,是對象 var result = {}; for (var i in o) { result[i] = deepClone(o[i]); } } else { // 基本類型值 var result = o; } return result; } console.log(deepClone(arr1)); console.log(deepClone(obj1));
到此這篇關於JavaScript數組及非數組對象的深淺克隆詳解原理的文章就介紹到這瞭,更多相關JavaScript 數組內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- JavaScript判斷是否為數組的各種方法匯總
- 帶你搞懂js的深拷貝
- JavaScript深拷貝的幾種實現方法實例
- JavaScript 賦值,淺復制和深復制的區別
- JS實現數組過濾從簡單到多條件篩選