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

資訊專欄INFORMATION COLUMN

js小拔高系列——寫一個深拷貝

wslongchen / 1321人閱讀

摘要:實(shí)現(xiàn)首先可以寫一個殼子函數(shù),包裹一個將要反復(fù)遞歸調(diào)用自身的函數(shù)。如果是引用型,將對應(yīng)的賦值為遞歸拷貝。另外在中需要使用進(jìn)行判斷,因?yàn)槲覀冎幌肟截愖陨淼膶傩浴?/p>

最近想全職當(dāng)碼農(nóng),面試時候被問到了深拷貝,我噼里啪啦說了一通,感覺很牛逼,問我自己寫過沒有,我說沒有,但是我可以寫。其實(shí)我很心虛,估計(jì)現(xiàn)場寫會卡殼。。。。。
思路

深拷貝需要迭代拷貝對象的所有屬性,如果屬性是引用型:Object,則繼續(xù)遞歸迭代。

實(shí)現(xiàn)

首先可以寫一個殼子函數(shù),包裹一個將要反復(fù)遞歸調(diào)用自身的函數(shù)。

function deepCopy(obj) {
    const handleDeepCopy = obj=>{
       const clonedObj = obj instanceof Array? []:{}
      return clonedObj
    }
    return handleDeepCopy(obj)
}

clonedObj就是即將克隆返回的新對象
今后會這么使用它:let newobj = deepCopy(oldobj)
newobj就是經(jīng)過深拷貝的新對象,這樣在操作newobj的時候就不會對oldobj產(chǎn)生干擾了

接著完善遞歸拷貝邏輯。

用for in迭代數(shù)組和對象的屬性。(若不用forin迭代,用foreach代碼會比較多,數(shù)組和對象的處理方式會有所不同)

判斷屬性的類型,是否是引用型。

如果是引用型,將clonedObj對應(yīng)的property賦值為handleDeepCopy(obj[property])【遞歸拷貝】。

如果不是引用型,直接將clonedObj對應(yīng)的property賦值為obj[property]。

function deepCopy(obj) {
    const handleDeepCopy = obj=>{
       const clonedObj = obj instanceof Array? []:{}
      // add for in logic here
      for (let keyOrIndex in obj) {
          if(obj[keyOrIndex] instanceof Object) {
              clonedObj[keyOrIndex] = handleDeepCopy(obj[keyOrIndex])
          } else {
              clonedObj[keyOrIndex] = obj[keyOrIndex]
          }
      }
      // for in logic over
      return clonedObj
    }
    return handleDeepCopy(obj)
}

以上邏輯還有疏忽的地方,沒有在開始時判斷傳進(jìn)的obj究竟是不是一個引用型,如果不是,就應(yīng)該直接將obj返回。另外在for in中需要使用hasOwnProperty進(jìn)行判斷,因?yàn)槲覀冎幌肟截恛bj自身的屬性。為了節(jié)約篇幅,增加以上邏輯后修改的代碼在:stackblitz

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

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

相關(guān)文章

  • js拔高——一個reduce

    摘要:緣起最近看油管里面有一個關(guān)于面試的視頻,里面提到了可能會讓你寫一寫等函數(shù),于是也來一起小拔高拔高。于是知道我們寫的回調(diào)會被調(diào)用,并且傳一個進(jìn)來。其中累加值的初始值是我們傳的,如果我們沒傳,那么累加值的初始值就會是數(shù)組的第一個元素。 緣起:最近看油管里面有一個關(guān)于js面試的視頻,里面提到了可能會讓你寫一寫reduce等函數(shù),于是也來一起小拔高拔高。 先寫寫map 首先回憶平時是如何使...

    ASCH 評論0 收藏0
  • 「讀懂源碼系列4」lodash 是如何實(shí)現(xiàn)拷貝的(下)

    摘要:用于檢測自己是否在自己的原型鏈上如果是函數(shù),則取出該函數(shù)的原型對象否則,取出對象的原型對象其中,的判斷,是為了確定的類型是對象或數(shù)組。相當(dāng)于,而的構(gòu)造函數(shù)是一個函數(shù)對象。 showImg(https://segmentfault.com/img/bVbq2N1?w=640&h=437); 前言 接著上一篇文章 lodash 是如何實(shí)現(xiàn)深拷貝的(上),今天會繼續(xù)解讀 _.cloneDee...

    zombieda 評論0 收藏0
  • 前端經(jīng)典文章

    摘要:上周末看這篇文章時,偶有靈光,所以,分享出來給大家一起看看前端面試四月二十家前端面試題分享請各位讀者添加一下作者的微信公眾號,以后有新的文章,將在微信公眾號直接推送給各位,非常感謝。 前端切圖神器 avocode 有了這個神器,切圖再也腰不酸,腿不疼了。 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果讀完本文還不懂,...

    lowett 評論0 收藏0
  • JavaScript系列--淺析JavaScript解析賦值、淺拷貝拷貝的區(qū)別

    摘要:它將返回目標(biāo)對象。有些文章說是深拷貝,其實(shí)這是不正確的。深拷貝相比于淺拷貝速度較慢并且花銷較大??截惽昂髢蓚€對象互不影響。使用深拷貝的場景完全改變變量之后對沒有任何影響,這就是深拷貝的魔力。 一、賦值(Copy) 賦值是將某一數(shù)值或?qū)ο筚x給某個變量的過程,分為: 1、基本數(shù)據(jù)類型:賦值,賦值之后兩個變量互不影響 2、引用數(shù)據(jù)類型:賦址,兩個變量具有相同的引用,指向同一個對象,相互之間有...

    laznrbfe 評論0 收藏0
  • 前端數(shù)據(jù)扁平化與持久化

    摘要:與持久化工程師花了年時間打造,與同期出現(xiàn)。有持久化數(shù)據(jù)結(jié)構(gòu),如等,并發(fā)安全。總結(jié)篇幅有限,時間也比較晚了,關(guān)于前端數(shù)據(jù)的扁平化與持久化處理先講這么多了,有興趣的同學(xué)可以關(guān)注下,后面有時間會多整理分享。 (PS: 時間就像海綿里的水,擠到?jīng)]法擠,只能擠擠睡眠時間了~ 知識點(diǎn)還是需要整理的,付出總會有收獲,tired but fulfilled~) 前言 最近業(yè)務(wù)開發(fā),從零搭建網(wǎng)頁生成器,...

    dreamtecher 評論0 收藏0

發(fā)表評論

0條評論

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