實(shí)現(xiàn)一個(gè)深拷貝

1.如果是函數(shù)類型和普通類型直接返回原來的值。
2.如果是正則,直接返回原來的值。
3.如果是日期類型,直接返回原來的值。
4.需要新建一個(gè)WeakMap的表用來存儲(chǔ)被拷貝過的值,并且在遞歸的時(shí)候傳下去,這樣可以避免對(duì)象引用自己造成無限遞歸。
5.拷貝的時(shí)候只拷貝對(duì)象的私有屬性。

//deepClone
const deepClone = (value, hash = new WeakMap) => {
    if(value == null){ // 這里排除掉null 和 undefine 因?yàn)閚ull == undefine
        return false  
    } 
    if(typeof value !== 'object') return value // 這里包含了函數(shù)類型
    if(value instanceof RegExp) return new RegExp(value)
    if(value instanceof Date) return new Date(value)
    // 根據(jù)當(dāng)前屬性構(gòu)造一個(gè)新的實(shí)例    
    let instance = new value.constructor
     // 這里做一下防止循環(huán)引用的處理
     if(hash.has(value)){
        return hash.get(value)
    }
    hash.set(value, instance) // 已經(jīng)拷貝過的存放在表里作為記錄
    for (const key in value) {
        if (value.hasOwnProperty(key)) { // 只拷貝私有屬性
           instance[key] = deepClone(value[key], hash) // 這里表向下傳遞作為記錄
        }
    }
    return instance
}

// test
let obj = {
    name: 'teacc',
    age: 25,
    other:{
        a: 1
    }
}
obj.b = obj
let cloneObj = deepClone(obj)
cloneObj.other.a = 2
console.log(obj)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 淺拷貝只復(fù)制指向某個(gè)對(duì)象的引用,而不復(fù)制對(duì)象本身,新舊對(duì)象還是共享同一塊內(nèi)存;但深拷貝會(huì)另外創(chuàng)造一個(gè)一模一樣的對(duì)象...
    悄敲閱讀 1,302評(píng)論 0 2
  • 深拷貝與淺拷貝的區(qū)別?如何實(shí)現(xiàn)一個(gè)深拷貝 在回答這個(gè)問題前,我們先來回顧一下JS中兩大數(shù)據(jù)類型 基本類型 Unde...
    憶當(dāng)年L閱讀 1,097評(píng)論 0 0
  • 深拷貝和淺拷貝是針對(duì)復(fù)雜數(shù)據(jù)類型來說的,淺拷貝只拷貝一層,而深拷貝是層層拷貝。 代碼中理解... <!DOCTYP...
    果粒橙沒有粒閱讀 990評(píng)論 0 1
  • 前言:js如何實(shí)現(xiàn)一個(gè)深拷貝 這是一個(gè)老生常談的問題,也是在求職過程中的高頻面試題,考察的知識(shí)點(diǎn)十分豐富,本文將對(duì)...
    丶chlorine閱讀 497評(píng)論 0 2
  • 這是我第一次一個(gè)人坐在車?yán)锊辉富丶遥m然家里也只有我一個(gè)人。有太多的事情、太多的心情需要平復(fù)。 像夜里孤獨(dú)的...
    十九o閱讀 455評(píng)論 0 0

友情鏈接更多精彩內(nèi)容