摘要:克隆的概念淺克隆原始類型為值傳遞,對(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ù)深克隆的方法
通過遞歸去復(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; }
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
摘要:判斷參數(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...
摘要:對(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ì)分為三種情況編寫代碼。其中,要判斷...
摘要:引用類型之所以會(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)引用等問...
摘要:基本數(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ù)制;而深拷貝的話,它不...
摘要:通過新增方法規(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ì)非常感...
摘要:針對(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...
閱讀 2013·2021-11-15 18:09
閱讀 908·2021-09-06 15:13
閱讀 2646·2021-08-23 09:43
閱讀 2030·2019-08-30 15:54
閱讀 2225·2019-08-30 13:56
閱讀 2489·2019-08-26 11:31
閱讀 3088·2019-08-26 10:56
閱讀 711·2019-08-26 10:28