JavaScript對(duì)象之深度克隆介紹
也不知道從什么時(shí)候開始,前端圈冒出了個(gè)新詞:對(duì)象深度克隆??雌饋砗孟窈芨叽笊系臉幼?,實(shí)際上并不新鮮,在我們的實(shí)際項(xiàng)目開發(fā)中,你可能早已用到,只不過由于漢字的博大精深,有些原本很簡單的事物被一些看似專業(yè)的詞匯稍加修飾,就變得神秘起來了。
首先為什么要將一個(gè)對(duì)象進(jìn)行深克隆?請(qǐng)?jiān)试S我進(jìn)行一個(gè)猜測:你有時(shí)一定會(huì)認(rèn)為js的內(nèi)置對(duì)象document太長,那么你可能會(huì)這樣做:
var d = document;
d.by = function(id){
return d.getElementById(id);
};
d.by('id').innerHTML = 'hello sentsin';
上述代碼對(duì)document.getElementById進(jìn)行了簡化,同時(shí)在原document對(duì)象中也增加了一個(gè)by的成員方法,你可以通過document.hasOwnProperty('by')返回的狀態(tài)值來驗(yàn)證你的判斷。再看下面一個(gè)例子。
var person = {name: '賢心', profession: '前端開發(fā)', place: '杭州'};
var newPerson = person;
newPerson.age = '24';
console.log(person);
//結(jié)果:{name: '賢心', profession: '前端開發(fā)', place: '杭州', age: 24}
由此可見,將一個(gè)對(duì)象通過簡單的傳遞給一個(gè)新的變量時(shí),僅僅只是給該對(duì)象增添了一個(gè)別名。這意味著,通過對(duì)該別名的操作,原有對(duì)象鍵值會(huì)發(fā)生改變。但問題在于,有時(shí)我們希望newPerson完全獨(dú)立于person,彼此之間不存在同步關(guān)系,那么就需要生成一個(gè)副本,請(qǐng)看例子:
var cloneObj = function(obj){
var str, newobj = obj.constructor === Array ? [] : {};
if(typeof obj !== 'object'){
return;
} else if(window.JSON){
str = JSON.stringify(obj), //系列化對(duì)象
newobj = JSON.parse(str); //還原
} else {
for(var i in obj){
newobj[i] = typeof obj[i] === 'object' ?
cloneObj(obj[i]) : obj[i];
}
}
return newobj;
};
//測試
var obj = {a: 0, b: 1, c: 2};
var arr = [0, 1, 2];
//執(zhí)行深度克隆
var newobj = cloneObj(obj);
var newarr = cloneObj(arr);
//對(duì)克隆后的新對(duì)象進(jìn)行成員刪除
delete newobj.a;
newarr.splice(0,1);
console.log(obj, arr, newobj, newarr);
//結(jié)果: {a: 0, b: 1, c: 2}, [0, 1, 2], {b: 1, c: 2}, [1, 2];
這便是所謂的對(duì)象克隆。不過有幾處需要解釋一下。代碼中的JSON對(duì)象及其成員方法stringify和parse屬于ECMAScript5規(guī)范,它們分別負(fù)責(zé)將一個(gè)對(duì)象(包括數(shù)組對(duì)象)轉(zhuǎn)換成字符串,和還原,從而實(shí)現(xiàn)對(duì)象的深拷貝。那么對(duì)于低級(jí)瀏覽器(如IE),拷貝數(shù)組的話,可以用newobj.concat(obj),而普通對(duì)象,就索性枚舉賦值好了。
相關(guān)文章
IE 上下滾動(dòng)展示模仿Marquee機(jī)制
最近要做一個(gè)大屏幕展示上下滾動(dòng)的列表,而IE自帶的Marquee,無法滿足需要,隨自己寫了一個(gè)滾動(dòng)機(jī)制,代碼在附件中2009-12-12js+css實(shí)現(xiàn)tab菜單切換效果的方法
這篇文章主要介紹了js+css實(shí)現(xiàn)tab菜單切換效果的方法,以實(shí)例形式完整講述了css與js的實(shí)現(xiàn)代碼,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01簡單聊聊JavaScript的事件循環(huán)機(jī)制
前端開發(fā)的童鞋應(yīng)該都知道,JavaScript是一門單線程的腳本語言,這就意味著JavaScript 代碼在執(zhí)行的時(shí)候,只有一個(gè)主線程來執(zhí)行所有的任務(wù),同一個(gè)時(shí)間只能做同一件事情,這篇文章主要給大家介紹了關(guān)于JavaScript事件循環(huán)機(jī)制的相關(guān)資料,需要的朋友可以參考下2022-03-03VS?Code中JavaScript環(huán)境搭建配置全過程
node.js大部分基本模塊都用JavaScript語言編寫,JavaScript最早是運(yùn)行在瀏覽器中,通常作為客戶端程序設(shè)計(jì)語言使用,node.js的出現(xiàn)使JavaScript也能用于服務(wù)端編程,這篇文章主要給大家介紹了關(guān)于VS?Code中JavaScript環(huán)境搭建配置的相關(guān)資料,需要的朋友可以參考下2024-02-02使用webpack/gulp構(gòu)建TypeScript項(xiàng)目的方法示例
這篇文章主要介紹了使用webpack/gulp構(gòu)建TypeScript項(xiàng)目的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12JavaScript返回網(wǎng)頁中錨點(diǎn)數(shù)目的方法
這篇文章主要介紹了JavaScript返回網(wǎng)頁中錨點(diǎn)數(shù)目的方法,涉及javascript使用document.anchors獲取錨點(diǎn)數(shù)目的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04js防抖具體實(shí)現(xiàn)以及詳細(xì)原理步驟說明(附實(shí)例)
節(jié)流和防抖這里兩個(gè)詞可能對(duì)一些初入JavaScript的同學(xué)比較陌生,下面這篇文章主要給大家介紹了關(guān)于js防抖具體實(shí)現(xiàn)以及詳細(xì)原理步驟的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09