亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

js clone

diabloneo / 3238人閱讀

摘要:克隆的概念淺克隆原始類型為值傳遞,對象類型仍為引用傳遞。深度克隆檢驗參數(shù),如果不是對象直接返回原型鏈上繼承過來的屬性無法通過檢測到,返回。方法用于將字符串解析為,可以任意轉(zhuǎn)換生成的值及其屬性,并返回值。

克隆的概念

淺克?。涸碱愋蜑橹祩鬟f,對象類型仍為引用傳遞。
深克?。核性鼗?qū)傩跃耆珡?fù)制,與原對象完全脫離,也就是說所有對于新對象的修改都不會反映到原對象中。

淺克隆就是將棧內(nèi)存中的引用復(fù)制一份,賦給一個新的變量,本質(zhì)上兩個指向堆內(nèi)存中的同一地址,內(nèi)容也相同,其中一個變化另一個內(nèi)容也會變化(根本上改變的是同一個對象)。
深克隆就是創(chuàng)建一個新的空對象,開辟一塊內(nèi)存,然后將原對象中的數(shù)據(jù)全部復(fù)制過去,完全切斷兩個對象間的聯(lián)系。
其實深拷貝和淺拷貝都是針對的引用類型,JS中的變量類型分為值類型(基本類型)和引用類型;對值類型進(jìn)行復(fù)制操作會對值進(jìn)行一份拷貝,而對引用類型賦值,則會進(jìn)行地址的拷貝,最終兩個變量指向同一份數(shù)據(jù)。

如果克隆對象是基本類型,我們直接賦值就可以了。
// 基本類型
var a = 1;
var b = a;
a = 2;
console.log(a, b); // 2, 1 ,a b指向不同的數(shù)據(jù)
如果不是基本類型,就有所不同了
// 引用類型指向同一份數(shù)據(jù)
var a = {c: 1};
var b = a;
a.c = 2;
console.log(a.c, b.c); // 2, 2 全是2,a b指向同一份數(shù)據(jù)
深克隆的方法
1)遞歸完成深克隆

通過遞歸去復(fù)制所有層級屬性,為了保證對象的所有屬性都被復(fù)制到,我們必須知道如果for循環(huán)以后,得到的元素仍是Object或者Array,那么需要再次循環(huán)。

//深度克隆
function deepClone(obj){
    // 檢驗參數(shù),如果不是對象直接返回;原型鏈上繼承過來的屬性無法通過hasOwnProperty檢測到,返回false。
    if(typeof obj != "object") return obj;
    var cloneObj=Object.prototype.toString.call(obj)=="[Object Array]" ? [] : {};
    for(var key in obj){
        // 判斷是不是直系屬性
        if(obj.hasOwnProperty(i)){
            // 判斷obj子元素是否為對象,如果是, 遞歸調(diào)用;如果不是直接復(fù)制
            cloneObj[i]=typeof obj[i]=="object" ? deepClone(obj[i]) : obj[i];
        }
    }
    return cloneObj;
}
2)利用JSON——一行代碼的深拷貝

cloneJSON內(nèi)部也是使用遞歸的方式,原來是JSON.stringify內(nèi)部做了循環(huán)引用的檢測。

function cloneJSON(source) {
    return JSON.parse(JSON.stringify(source));
}

parse方法用于將字符串解析為 JSON,可以任意轉(zhuǎn)換生成的值及其屬性,并返回值。sretingify方法用于從一個對象中解析出json字符串。
什么意思呢?就是將一個對象先解析為json對象,然后再解析成object對象。變來變?nèi)ロ樀绖?chuàng)建個對象完成復(fù)制。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/98350.html

相關(guān)文章

  • js克隆一個對象,支持循環(huán)引用的克隆

    摘要:判斷參數(shù)是否為待判斷的參數(shù)克隆一個對象要克隆的目標(biāo)對象克隆節(jié)點,綁定事件的有問題,暫不處理克隆在當(dāng)前作用域,在全局克隆其它對象,通過識別復(fù)制后的對象與原對象是否相同來決定傳不傳參數(shù),像數(shù)組是不能傳參數(shù)的使用防止對象重寫了方法支持節(jié)點克隆 (function(){ var toString=Object.prototype.toString,gObj={},cloneHelper=f...

    fai1017 評論0 收藏0
  • js實現(xiàn)clone方法對各種數(shù)據(jù)類型進(jìn)行復(fù)制

    摘要:對各種數(shù)據(jù)類型進(jìn)行復(fù)制,最初的思想是利用判別數(shù)據(jù)類型后利用語句分別賦值,但是有個問題和返回的都是,所以又要細(xì)分為三種情況編寫代碼。其中,要判斷一個對象為數(shù)組使用的是方法。 對各種數(shù)據(jù)類型進(jìn)行復(fù)制,最初的思想是利用typeof判別數(shù)據(jù)類型后利用switch語句分別賦值,但是有個問題:null、Array和Object返回的都是‘object’,所以又要細(xì)分為三種情況編寫代碼。其中,要判斷...

    CoffeX 評論0 收藏0
  • JS的深淺拷貝

    摘要:引用類型之所以會出現(xiàn)深淺拷貝的問題,實質(zhì)上是由于對基本類型和引用類型的處理不同。另外方法可以視為數(shù)組對象的淺拷貝。上面描述過的復(fù)雜問題依然存在,可以說是最簡陋但是日常工作夠用的深拷貝方式。 一直想梳理下工作中經(jīng)常會用到的深拷貝的內(nèi)容,然而遍覽了許多的文章,卻發(fā)現(xiàn)對深拷貝并沒有一個通用的完美實現(xiàn)方式。因為對深拷貝的定義不同,實現(xiàn)時的edge case過多,在深拷貝的時候會出現(xiàn)循環(huán)引用等問...

    xiaoxiaozi 評論0 收藏0
  • 復(fù)習(xí)Javascript專題(四):js中的深淺拷貝

    摘要:基本數(shù)據(jù)類型的復(fù)制很簡單,就是賦值操作,所以深淺拷貝也是針對,這類引用類型數(shù)據(jù)。它會拋棄對象的。另外,查資料過程中還看到這么一個詞結(jié)構(gòu)化克隆算法還有這一篇資料也有參考,也寫得比較詳細(xì)了的深淺拷貝 基本數(shù)據(jù)類型的復(fù)制很簡單,就是賦值操作,所以深淺拷貝也是針對Object,Array這類引用類型數(shù)據(jù)。 淺拷貝對于字符串來說,是值的復(fù)制,而對于對象來說則是對對象地址的復(fù)制;而深拷貝的話,它不...

    MobService 評論0 收藏0
  • JS面向?qū)ο蟮某绦蛟O(shè)計之繼承的實現(xiàn)-原型式繼承和寄生式繼承

    摘要:通過新增方法規(guī)范了原型式繼承。適用場景在沒有必要興師動眾地創(chuàng)建構(gòu)造函數(shù),而只想讓一個對象與另外一個對象保持類似的情況下,原型式繼承是完全可以勝任的。在主要考慮對象而不是自定義類型和構(gòu)造函數(shù)的情況下,寄生式繼承也是一種有用的模式。 --前言:最近在細(xì)讀Javascript高級程序設(shè)計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯誤,會非常感...

    lewinlee 評論0 收藏0
  • js中的深復(fù)制實現(xiàn)方法

    摘要:針對本話題,我在年月發(fā)布了新的文章深入剖析的深復(fù)制要實現(xiàn)深復(fù)制有很多辦法,比如最簡單的辦法有上面這種方法好處是非常簡單易用,但是壞處也顯而易見,這會拋棄對象的,也就是深復(fù)制之后,無論這個對象原本的構(gòu)造函數(shù)是什么,在深復(fù)制之后都會變成。 針對本話題,我在2015年5月發(fā)布了新的文章:深入剖析 JavaScript 的深復(fù)制 要實現(xiàn)深復(fù)制有很多辦法,比如最簡單的辦法有: var...

    Alliot 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<