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!

推薦閱讀: