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

首頁 > 語言 > JavaScript > 正文

JavaScript對象之深度克隆介紹

2024-05-06 16:11:43
字體:
供稿:網(wǎng)友
這篇文章主要介紹了JavaScript對象之深度克隆介紹,本文詳細的講解了什么是對象深度克隆,并給出了示例代碼,需要的朋友可以參考下
 
 

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

首先為什么要將一個對象進行深克隆?請允許我進行一個猜測:你有時一定會認為js的內(nèi)置對象document太長,那么你可能會這樣做:

 

復制代碼代碼如下:

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

 

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

 

復制代碼代碼如下:

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

 

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

 

復制代碼代碼如下:

var cloneObj = function(obj){
    var str, newobj = obj.constructor === Array ? [] : {};
    if(typeof obj !== 'object'){
        return;
    } else if(window.JSON){
        str = JSON.stringify(obj), //系列化對象
        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);
//對克隆后的新對象進行成員刪除
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];

 

這便是所謂的對象克隆。不過有幾處需要解釋一下。代碼中的JSON對象及其成員方法stringify和parse屬于ECMAScript5規(guī)范,它們分別負責將一個對象(包括數(shù)組對象)轉(zhuǎn)換成字符串,和還原,從而實現(xiàn)對象的深拷貝。那么對于低級瀏覽器(如IE),拷貝數(shù)組的話,可以用newobj.concat(obj),而普通對象,就索性枚舉賦值好了。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 太湖县| 七台河市| 甘孜县| 奈曼旗| 丹江口市| 炎陵县| 芒康县| 屏南县| 武邑县| 临清市| 中方县| 贞丰县| 若尔盖县| 哈密市| 淮滨县| 衡山县| 颍上县| 宁津县| 元氏县| 海原县| 娄烦县| 龙口市| 永仁县| 太仓市| 石棉县| 文安县| 福建省| 伽师县| 象山县| 建昌县| 安达市| 永川市| 芷江| 夹江县| 黎平县| 大洼县| 长顺县| 定兴县| 伊金霍洛旗| 封开县| 陇南市|