成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

js clone

diabloneo / 3199人閱讀

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

克隆的概念

淺克隆:原始類型為值傳遞,對(duì)象類型仍為引用傳遞。
深克?。核性鼗?qū)傩跃耆珡?fù)制,與原對(duì)象完全脫離,也就是說所有對(duì)于新對(duì)象的修改都不會(huì)反映到原對(duì)象中。

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

如果克隆對(duì)象是基本類型,我們直接賦值就可以了。
// 基本類型
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ù)制所有層級(jí)屬性,為了保證對(duì)象的所有屬性都被復(fù)制到,我們必須知道如果for循環(huán)以后,得到的元素仍是Object或者Array,那么需要再次循環(huán)。

//深度克隆
function deepClone(obj){
    // 檢驗(yàn)參數(shù),如果不是對(duì)象直接返回;原型鏈上繼承過來的屬性無法通過hasOwnProperty檢測(cè)到,返回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子元素是否為對(duì)象,如果是, 遞歸調(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)引用的檢測(cè)。

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98350.html

相關(guān)文章

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

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

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

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

    CoffeX 評(píng)論0 收藏0
  • JS的深淺拷貝

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

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

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

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

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

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

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

    Alliot 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<