欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2014年12月08日 10:54:07   投稿:junjie  
這篇文章主要介紹了JavaScript對(duì)象之深度克隆介紹,本文詳細(xì)的講解了什么是對(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ì)這樣做:

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

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è)例子。

復(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ì)象通過簡單的傳遞給一個(gè)新的變量時(shí),僅僅只是給該對(duì)象增添了一個(gè)別名。這意味著,通過對(duì)該別名的操作,原有對(duì)象鍵值會(huì)發(fā)生改變。但問題在于,有時(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;
};


//測試
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ī)制

    IE 上下滾動(dòng)展示模仿Marquee機(jī)制

    最近要做一個(gè)大屏幕展示上下滾動(dòng)的列表,而IE自帶的Marquee,無法滿足需要,隨自己寫了一個(gè)滾動(dòng)機(jī)制,代碼在附件中
    2009-12-12
  • js+css實(shí)現(xiàn)tab菜單切換效果的方法

    js+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ī)制

    簡單聊聊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-03
  • VS?Code中JavaScript環(huán)境搭建配置全過程

    VS?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)目的方法示例

    這篇文章主要介紹了使用webpack/gulp構(gòu)建TypeScript項(xiàng)目的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • JavaScript返回網(wǎng)頁中錨點(diǎn)數(shù)目的方法

    JavaScript返回網(wǎng)頁中錨點(diǎn)數(shù)目的方法

    這篇文章主要介紹了JavaScript返回網(wǎng)頁中錨點(diǎn)數(shù)目的方法,涉及javascript使用document.anchors獲取錨點(diǎn)數(shù)目的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • 一篇文章帶你從零快速上手Rollup

    一篇文章帶你從零快速上手Rollup

    這篇文章主要給大家介紹了如何通過一篇文章快速從零快速上手Rollup的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • JS實(shí)現(xiàn)圖片上傳預(yù)覽功能

    JS實(shí)現(xiàn)圖片上傳預(yù)覽功能

    本文給大家分享一段js代碼關(guān)于實(shí)現(xiàn)圖片上傳預(yù)覽功能,代碼簡單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-11-11
  • js防抖具體實(shí)現(xiàn)以及詳細(xì)原理步驟說明(附實(shí)例)

    js防抖具體實(shí)現(xiàn)以及詳細(xì)原理步驟說明(附實(shí)例)

    節(jié)流和防抖這里兩個(gè)詞可能對(duì)一些初入JavaScript的同學(xué)比較陌生,下面這篇文章主要給大家介紹了關(guān)于js防抖具體實(shí)現(xiàn)以及詳細(xì)原理步驟的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • JavaScript命名空間模式實(shí)例詳解

    JavaScript命名空間模式實(shí)例詳解

    這篇文章主要介紹了JavaScript命名空間模式,結(jié)合實(shí)例形式分析了javascript命名空間模式的相關(guān)概念、原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-06-06

最新評(píng)論