摘要:實(shí)現(xiàn)首先可以寫一個(gè)殼子函數(shù),包裹一個(gè)將要反復(fù)遞歸調(diào)用自身的函數(shù)。如果是引用型,將對(duì)應(yīng)的賦值為遞歸拷貝。另外在中需要使用進(jìn)行判斷,因?yàn)槲覀冎幌肟截愖陨淼膶傩浴?/p>
最近想全職當(dāng)碼農(nóng),面試時(shí)候被問到了深拷貝,我噼里啪啦說了一通,感覺很牛逼,問我自己寫過沒有,我說沒有,但是我可以寫。其實(shí)我很心虛,估計(jì)現(xiàn)場寫會(huì)卡殼。。。。。思路
深拷貝需要迭代拷貝對(duì)象的所有屬性,如果屬性是引用型:Object,則繼續(xù)遞歸迭代。
實(shí)現(xiàn)
首先可以寫一個(gè)殼子函數(shù),包裹一個(gè)將要反復(fù)遞歸調(diào)用自身的函數(shù)。
function deepCopy(obj) { const handleDeepCopy = obj=>{ const clonedObj = obj instanceof Array? []:{} return clonedObj } return handleDeepCopy(obj) }
clonedObj就是即將克隆返回的新對(duì)象
今后會(huì)這么使用它:let newobj = deepCopy(oldobj)
newobj就是經(jīng)過深拷貝的新對(duì)象,這樣在操作newobj的時(shí)候就不會(huì)對(duì)oldobj產(chǎn)生干擾了
接著完善遞歸拷貝邏輯。
用for in迭代數(shù)組和對(duì)象的屬性。(若不用forin迭代,用foreach代碼會(huì)比較多,數(shù)組和對(duì)象的處理方式會(huì)有所不同)
判斷屬性的類型,是否是引用型。
如果是引用型,將clonedObj對(duì)應(yīng)的property賦值為handleDeepCopy(obj[property])【遞歸拷貝】。
如果不是引用型,直接將clonedObj對(duì)應(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) }
以上邏輯還有疏忽的地方,沒有在開始時(shí)判斷傳進(jìn)的obj究竟是不是一個(gè)引用型,如果不是,就應(yīng)該直接將obj返回。另外在for in中需要使用hasOwnProperty進(jìn)行判斷,因?yàn)槲覀冎幌肟截恛bj自身的屬性。為了節(jié)約篇幅,增加以上邏輯后修改的代碼在:stackblitz
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/98883.html
摘要:緣起最近看油管里面有一個(gè)關(guān)于面試的視頻,里面提到了可能會(huì)讓你寫一寫等函數(shù),于是也來一起小拔高拔高。于是知道我們寫的回調(diào)會(huì)被調(diào)用,并且傳一個(gè)進(jìn)來。其中累加值的初始值是我們傳的,如果我們沒傳,那么累加值的初始值就會(huì)是數(shù)組的第一個(gè)元素。 緣起:最近看油管里面有一個(gè)關(guān)于js面試的視頻,里面提到了可能會(huì)讓你寫一寫reduce等函數(shù),于是也來一起小拔高拔高。 先寫寫map 首先回憶平時(shí)是如何使...
摘要:用于檢測自己是否在自己的原型鏈上如果是函數(shù),則取出該函數(shù)的原型對(duì)象否則,取出對(duì)象的原型對(duì)象其中,的判斷,是為了確定的類型是對(duì)象或數(shù)組。相當(dāng)于,而的構(gòu)造函數(shù)是一個(gè)函數(shù)對(duì)象。 showImg(https://segmentfault.com/img/bVbq2N1?w=640&h=437); 前言 接著上一篇文章 lodash 是如何實(shí)現(xiàn)深拷貝的(上),今天會(huì)繼續(xù)解讀 _.cloneDee...
摘要:上周末看這篇文章時(shí),偶有靈光,所以,分享出來給大家一起看看前端面試四月二十家前端面試題分享請(qǐng)各位讀者添加一下作者的微信公眾號(hào),以后有新的文章,將在微信公眾號(hào)直接推送給各位,非常感謝。 前端切圖神器 avocode 有了這個(gè)神器,切圖再也腰不酸,腿不疼了。 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果讀完本文還不懂,...
摘要:它將返回目標(biāo)對(duì)象。有些文章說是深拷貝,其實(shí)這是不正確的。深拷貝相比于淺拷貝速度較慢并且花銷較大。拷貝前后兩個(gè)對(duì)象互不影響。使用深拷貝的場景完全改變變量之后對(duì)沒有任何影響,這就是深拷貝的魔力。 一、賦值(Copy) 賦值是將某一數(shù)值或?qū)ο筚x給某個(gè)變量的過程,分為: 1、基本數(shù)據(jù)類型:賦值,賦值之后兩個(gè)變量互不影響 2、引用數(shù)據(jù)類型:賦址,兩個(gè)變量具有相同的引用,指向同一個(gè)對(duì)象,相互之間有...
摘要:與持久化工程師花了年時(shí)間打造,與同期出現(xiàn)。有持久化數(shù)據(jù)結(jié)構(gòu),如等,并發(fā)安全。總結(jié)篇幅有限,時(shí)間也比較晚了,關(guān)于前端數(shù)據(jù)的扁平化與持久化處理先講這么多了,有興趣的同學(xué)可以關(guān)注下,后面有時(shí)間會(huì)多整理分享。 (PS: 時(shí)間就像海綿里的水,擠到?jīng)]法擠,只能擠擠睡眠時(shí)間了~ 知識(shí)點(diǎn)還是需要整理的,付出總會(huì)有收獲,tired but fulfilled~) 前言 最近業(yè)務(wù)開發(fā),從零搭建網(wǎng)頁生成器,...
閱讀 1193·2021-11-15 18:00
閱讀 1789·2021-10-08 10:15
閱讀 752·2021-09-04 16:48
閱讀 2373·2021-09-04 16:48
閱讀 1313·2019-08-29 18:40
閱讀 965·2019-08-29 13:08
閱讀 2987·2019-08-26 14:06
閱讀 1111·2019-08-26 13:35