国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

JavaScript對(duì)象之深度克隆介紹

2019-11-20 13:47:22
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

也不知道從什么時(shí)候開始,前端圈冒出了個(gè)新詞:對(duì)象深度克隆。看起來(lái)好像很高大上的樣子,實(shí)際上并不新鮮,在我們的實(shí)際項(xiàng)目開發(fā)中,你可能早已用到,只不過(guò)由于漢字的博大精深,有些原本很簡(jiǎn)單的事物被一些看似專業(yè)的詞匯稍加修飾,就變得神秘起來(lái)了。

首先為什么要將一個(gè)對(duì)象進(jìn)行深克隆?請(qǐng)?jiān)试S我進(jìn)行一個(gè)猜測(cè):你有時(shí)一定會(huì)認(rèn)為js的內(nèi)置對(duì)象document太長(zhǎng),那么你可能會(huì)這樣做:

復(fù)制代碼 代碼如下:

var d = document;
d.by = function(id){
    return d.getElementById(id);
};
d.by('id').innerHTML = 'hello sentsin';

上述代碼對(duì)document.getElementById進(jìn)行了簡(jiǎn)化,同時(shí)在原document對(duì)象中也增加了一個(gè)by的成員方法,你可以通過(guò)document.hasOwnProperty('by')返回的狀態(tài)值來(lái)驗(yàn)證你的判斷。再看下面一個(gè)例子。

復(fù)制代碼 代碼如下:

var person = {name: '賢心', profession: '前端開發(fā)', place: '杭州'};
var newPerson = person;
newPerson.age = '24';
console.log(person);
//結(jié)果:{name: '賢心', profession: '前端開發(fā)', place: '杭州', age: 24}

由此可見,將一個(gè)對(duì)象通過(guò)簡(jiǎn)單的傳遞給一個(gè)新的變量時(shí),僅僅只是給該對(duì)象增添了一個(gè)別名。這意味著,通過(guò)對(duì)該別名的操作,原有對(duì)象鍵值會(huì)發(fā)生改變。但問(wèn)題在于,有時(shí)我們希望newPerson完全獨(dú)立于person,彼此之間不存在同步關(guān)系,那么就需要生成一個(gè)副本,請(qǐng)看例子:

復(fù)制代碼 代碼如下:

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;
};


//測(cè)試
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ì)象克隆。不過(guò)有幾處需要解釋一下。代碼中的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ì)象,就索性枚舉賦值好了。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 清新县| 柏乡县| 昭觉县| 普陀区| 永新县| 图木舒克市| 霞浦县| 大理市| 永昌县| 安龙县| 新余市| 永福县| 保康县| 金乡县| 集贤县| 高尔夫| 山阴县| 宁河县| 密山市| 盐山县| 岳池县| 手游| 凤阳县| 苍山县| 北碚区| 望谟县| 郴州市| 双鸭山市| 宁安市| 两当县| 保定市| 兴仁县| 巴中市| 康乐县| 西充县| 无为县| 天峻县| 吉木萨尔县| 娄烦县| 万荣县| 新营市|