真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Javascript深拷貝的原理分析

本篇內(nèi)容介紹了“Javascript深拷貝的原理分析”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)公司專注于鐵鋒網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供鐵鋒營(yíng)銷型網(wǎng)站建設(shè),鐵鋒網(wǎng)站制作、鐵鋒網(wǎng)頁設(shè)計(jì)、鐵鋒網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造鐵鋒網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供鐵鋒網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

為啥要用深拷貝?

在很多情況下,我們都需要給變量賦值,給內(nèi)存地址賦予一個(gè)值,但是在賦值引用值類型的時(shí)候,只是共享一個(gè)內(nèi)存區(qū)域,導(dǎo)致賦值的時(shí)候,還跟之前的值保持一直性。

看一個(gè)具體的例子

// 給test賦值了一個(gè)對(duì)象  var test = {  a: 'a',  b: 'b'  };     // 將test賦值給test2  // 此時(shí)test和test2是共享了同一塊內(nèi)存對(duì)象,這也就是淺拷貝  var test2 = test;     test2.a = 'a2';     test.a === 'a2'// 為true

圖解:

Javascript深拷貝的原理分析

這下就很好理解為什么引用值類型數(shù)據(jù)相互影響問題。

實(shí)現(xiàn)

實(shí)現(xiàn)一個(gè)深拷貝函數(shù),就不得不說javascript的數(shù)值類型。

判斷javascript類型

javascript中有以下基本類型

類型描述
undefinedundefined類型只有一個(gè)值undefined,它是變量未被賦值時(shí)的值
nullnull類型也只有一個(gè)值null, 它是一個(gè)空的對(duì)象引用
BooleanBoolean有兩種取值true和false
String它表示文本信息
Number它表示數(shù)字信息
Object它是一系列屬性的無序集合, 包括函數(shù)Function和數(shù)組Array

使用typeof是無法判斷function和array的,這里使用Object.prototype.toString方法。  默認(rèn)情況下,每個(gè)對(duì)象都會(huì)從Object上繼承到toString()方法,如果這個(gè)方法沒有被這個(gè)對(duì)象自身或者更接近的上層原型上的同名方法覆蓋(遮蔽),則調(diào)用該對(duì)象的toString()方法時(shí)會(huì)返回”[object  type]”,這里的字符串type表示了一個(gè)對(duì)象類型

function type(obj) {  var toString = Object.prototype.toString;  var map = {      '[object Boolean]'  : 'boolean',      '[object Number]'   : 'number',      '[object String]'   : 'string',      '[object Function]' : 'function',      '[object Array]'    : 'array',      '[object Date]'     : 'date',      '[object RegExp]'   : 'regExp',      '[object Undefined]': 'undefined',      '[object Null]'     : 'null',      '[object Object]'   : 'object'  };  return map[toString.call(obj)];  }

實(shí)現(xiàn)deepClone

對(duì)于非引用值類型的數(shù)值,直接賦值,而對(duì)于引用值類型(object)還需要再次遍歷,遞歸賦值。

function deepClone(data) {  var t = type(data), o, i, ni;  if(t === 'array') {      o = [];  }else if( t === 'object') {      o = {};  }else {      return data;  }  if(t === 'array') {      for (i = 0, ni = data.length; i < ni; i++) {          o.push(deepClone(data[i]));      }      return o;  }else if( t === 'object') {      for( i in data) {          o[i] = deepClone(data[i]);      }      return o;  }  }

這里有個(gè)點(diǎn)大家要注意下,對(duì)于function類型,博主這里是直接賦值的,還是共享一個(gè)內(nèi)存值。這是因?yàn)楹瘮?shù)更多的是完成某些功能,有個(gè)輸入值和返回值,而且對(duì)于上層業(yè)務(wù)而言更多的是完成業(yè)務(wù)功能,并不需要真正將函數(shù)深拷貝。

但是function類型要怎么拷貝呢?

其實(shí)博主只想到了用new來操作一下,但是function就會(huì)執(zhí)行一遍,不敢想象會(huì)有什么執(zhí)行結(jié)果哦!o(╯□╰)o!其它暫時(shí)還沒有什么好的想法,歡迎大家指導(dǎo)哦!

到這里差不多也就實(shí)現(xiàn)完了深拷貝,又有人覺的怎么沒有實(shí)現(xiàn)淺拷貝呢?

淺拷貝?

對(duì)于淺拷貝而言,可以理解為只操作一個(gè)共同的內(nèi)存區(qū)域!這里會(huì)存在危險(xiǎn)!(。﹏。*) 。

如果直接操作這個(gè)共享的數(shù)據(jù),不做控制的話,會(huì)經(jīng)常出現(xiàn)數(shù)據(jù)異常,被其它部分更改。所以應(yīng)該不要直接操作數(shù)據(jù)源,給數(shù)據(jù)源封裝一些方法,來對(duì)數(shù)據(jù)來進(jìn)行CURD操作。

到這里估計(jì)就差不多了,但是作為一個(gè)前端,不僅僅考慮javascript本身,還得考慮到dom、瀏覽器等。

Element類型

來看下面代碼,結(jié)果會(huì)返回啥呢?

Object.prototype.toString.call(document.getElementsByTagName('div')[0])

答案是[object HTMLDivElement]

有時(shí)候保存了dom元素,  一不小心進(jìn)行深拷貝,上面的深拷貝函數(shù)就缺少了對(duì)Element元素的判斷。而判斷Element元素要使用instanceof來判斷。因?yàn)閷?duì)于不同的標(biāo)簽,tostring會(huì)返回對(duì)應(yīng)不同的標(biāo)簽的構(gòu)造函數(shù)。

function type(obj) {  var toString = Object.prototype.toString;  var map = {      '[object Boolean]'  : 'boolean',      '[object Number]'   : 'number',      '[object String]'   : 'string',      '[object Function]' : 'function',      '[object Array]'    : 'array',      '[object Date]'     : 'date',      '[object RegExp]'   : 'regExp',      '[object Undefined]': 'undefined',      '[object Null]'     : 'null',      '[object Object]'   : 'object'  };  if(obj instanceof Element) {          return 'element';  }  return map[toString.call(obj)];  }

其它方式?

JSON實(shí)現(xiàn)

先通過JSON.stringify一下,然后再JSON.parse一下,就能實(shí)現(xiàn)深拷貝。但是數(shù)據(jù)類型只支持基本數(shù)值類型。

var obj = {      a: 'a',          b: function(){console.log('b')}  }     //在JSON.stringify的時(shí)候就會(huì)把function給過濾了。     JSON.stringify(obj)// "{"a":"a"}"

“Javascript深拷貝的原理分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


當(dāng)前名稱:Javascript深拷貝的原理分析
URL鏈接:http://weahome.cn/article/pcgiei.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部