JavaScript數(shù)組及非數(shù)組對(duì)象的深淺克隆詳解原理
什么是淺克隆、深克隆
淺克?。褐苯訉⒋鎯?chǔ)在棧中的值賦值給對(duì)應(yīng)變量,如果是基本數(shù)據(jù)類型,則直接賦值對(duì)應(yīng)的值,如果是引用類型,則賦值的是地址。
深克?。簩?shù)據(jù)賦值給對(duì)應(yīng)的變量,從而產(chǎn)生一個(gè)與源數(shù)據(jù)不相干的新數(shù)據(jù)(數(shù)據(jù)地址已變化)。即對(duì)象各個(gè)層級(jí)的屬性。
JavaScript中基本數(shù)據(jù)類型使用符號(hào)“=”可以進(jìn)行克隆,引用數(shù)據(jù)類型使用符號(hào)“=”只是改變了變量的指向,并沒有進(jìn)行真正的克隆操作。
1.對(duì)數(shù)組進(jìn)行克隆
1.1 淺克隆
使用for循環(huán)進(jìn)行淺克隆。
var arr1 = ['demo', 1, 2];
var arr2 = [];
// 數(shù)組的淺克隆
for (var i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
console.log(arr2);
console.log(arr1 == arr2);
輸出結(jié)果:
Array(3)0: "demo"1: 12: 2length: 3[[Prototype]]: Array(0)
false
1.2 深克隆
使用遞歸進(jìn)行深克隆。
function deepClone(o) {
var result = [];
for (var i = 0; i < o.length; i++) {
result.push(deepClone(o[i]));
}
return result;
}
2.對(duì)非數(shù)組對(duì)象進(jìn)行克隆
2.1 淺克隆
使用for循環(huán)進(jìn)行淺克隆。
var obj1 = { a: 1, b: 2, c: 3, d: [4, 5, { e: 'demo' }] };
var obj2 = {};
// 對(duì)象的淺克隆
for (var i in obj1) {
obj2[i] = obj1[i];
}
console.log(obj2);
console.log(obj1 == obj2);
輸出結(jié)果:
{a: 1, b: 2, c: 3, d: Array(3)}
false
2.2 深克隆
使用遞歸進(jìn)行深克隆。
function deepClone(o) {
var result = {};
for (var i in o) {
result[i] = deepClone(o[i]);
}
return result;
}
3.整合深克隆函數(shù)
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)) {
// 是數(shù)組
var result = [];
for (var i = 0; i < o.length; i++) {
result.push(deepClone(o[i]));
}
} else if (typeof o == 'object') {
// 非數(shù)組,是對(duì)象
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));
到此這篇關(guān)于JavaScript數(shù)組及非數(shù)組對(duì)象的深淺克隆詳解原理的文章就介紹到這了,更多相關(guān)JavaScript 數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js+html5實(shí)現(xiàn)canvas繪制橢圓形圖案的方法
這篇文章主要介紹了js+html5實(shí)現(xiàn)canvas繪制橢圓形圖案的方法,涉及html5圖形繪制的基礎(chǔ)技巧,感興趣的朋友可以參考一下2016-05-05
javascript高級(jí)程序設(shè)計(jì)第二版第十二章事件要點(diǎn)總結(jié)(常用的跨瀏覽器檢測(cè)方法)
javascript高級(jí)程序設(shè)計(jì)第二版第十二章事件要點(diǎn)總結(jié)(常用的跨瀏覽器檢測(cè)方法),需要的朋友可以參考下2012-08-08
原生javascript實(shí)現(xiàn)分頁(yè)效果
這篇文章主要為大家詳細(xì)介紹了原生javascript實(shí)現(xiàn)分頁(yè)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
原生js實(shí)現(xiàn)下拉框功能(支持鍵盤事件)
本文主要分享了原生js實(shí)現(xiàn)下拉框(支持鍵盤事件)功能的示例代碼。具有一定的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01
JS的replace方法與正則表達(dá)式結(jié)合應(yīng)用講解
replace方法的語(yǔ)法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(string),reExp可以是正則表達(dá)式對(duì)象(RegExp)也可以是字符串(string),replaceText是替代查找到的字符串。。為了幫助大家更好的理解,下面舉個(gè)簡(jiǎn)單例子說明一下2007-12-12
JS實(shí)現(xiàn)的顏色實(shí)時(shí)漸變效果完整實(shí)例
這篇文章主要介紹了JS實(shí)現(xiàn)的顏色實(shí)時(shí)漸變效果,結(jié)合實(shí)例形式分析了JavaScript結(jié)合時(shí)間函數(shù)定時(shí)觸發(fā)動(dòng)態(tài)改變頁(yè)面元素屬性的相關(guān)技巧,需要的朋友可以參考下2016-03-03
Javascript遍歷Html Table示例(包括內(nèi)容和屬性值)
這篇文章主要介紹了Javascript如何遍歷Html Table(包括內(nèi)容和屬性值),需要的朋友可以參考下2014-07-07

