成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

javascript對深拷貝對象的研坑

caozhijian / 333人閱讀

摘要:對于深拷貝,淺拷貝的概念不多說,概念可以自行百度喲這里對深拷貝對象進(jìn)行一些研究只有值類型數(shù)據(jù)的深拷貝針對只有值的數(shù)據(jù)對象,下面一行代碼足以不嚴(yán)謹(jǐn)?shù)暮唵蔚纳羁截愖⒁膺@里問題存在沒有對參數(shù)做檢驗(yàn)判斷是否對象的邏輯不夠嚴(yán)謹(jǐn)沒有考慮數(shù)組的兼容進(jìn)階深

對于深拷貝,淺拷貝的概念不多說,概念可以自行百度喲!這里對深拷貝對象進(jìn)行一些研究!

只有值類型數(shù)據(jù)的深拷貝

針對只有值的數(shù)據(jù)對象,下面一行代碼足以!

JSON.parse(JSON.stringify(obj))
不嚴(yán)謹(jǐn)?shù)暮唵蔚纳羁截?/b>
function clone(source) {
    var target = {};
    for(var i in source) {
        if (source.hasOwnProperty(i)) {
            if (typeof source[i] === "object") {
                target[i] = clone(source[i]); // 注意這里
            } else {
                target[i] = source[i];
            }
        }
    }

    return target;
}

問題存在:

沒有對參數(shù)做檢驗(yàn)

判斷是否對象的邏輯不夠嚴(yán)謹(jǐn)

沒有考慮數(shù)組的兼容

進(jìn)階深拷貝
function isObj(obj)
{
    return (typeof obj === "object" || typeof obj === "function") && obj !== null
}

function deepCopy(obj)
{
    let tempObj = Array.isArray(obj) ? [] :{};
    for(let key in obj)
    {
        tempObj[key] = isObj(obj[key]) ? deepCopy(obj[key]) : obj[key];
    }
    return tempObj;
}

問題存在:

拷貝環(huán),也就是對 對象循環(huán)引用 的拷貝出現(xiàn)問題

針對環(huán)的深拷貝

可以使用一個(gè)WeakMap結(jié)構(gòu)存儲(chǔ)已經(jīng)被拷貝的對象,每一次進(jìn)行拷貝的時(shí)候就先向WeakMap查詢該對象是否已經(jīng)被拷貝,如果已經(jīng)被拷貝則取出該對象并返回,將deepCopy函數(shù)改造成如下:

function isObj(obj)
{
    return (typeof obj === "object" || typeof obj === "function") && obj !== null
}
function deepCopy(obj, hash = new WeakMap()) {    
    if(hash.has(obj)) return hash.get(obj)    
    let cloneObj = Array.isArray(obj) ? [] : {}
    hash.set(obj, cloneObj)    
    for (let key in obj) {
        cloneObj[key] = isObj(obj[key]) ? deepCopy(obj[key], hash) : obj[key];
    }   
    return cloneObj
}

問題存在:

沒有考慮對new Date(),正則,函數(shù)類型的對象的拷貝

結(jié)合環(huán),針對date,reg,箭頭函數(shù)類型的深拷貝
const obj = {    arr: [111, 222],    obj: {key: "對象"},    a: () => {console.log("函數(shù)")},    date: new Date(),    reg: /正則/ig}

function isObj(obj)
{
    return (typeof obj === "object" || typeof obj === "function") && obj !== null
}
function deepCopy(obj, hash = new WeakMap()) {  
      let cloneObj;   
      let Constructor = obj.constructor; 
      switch(Constructor){       
        case RegExp:
            cloneObj = new Constructor(obj)         
            break;
        case Date:
            cloneObj = new Constructor(obj.getTime())           
            break;
        case Function:
            cloneObj = eval(obj.toString());
            break;
        default:           
         if(hash.has(obj)) return hash.get(obj)
            cloneObj = new Constructor()
            hash.set(obj, cloneObj)
      }   

      for (let key in obj) {
            cloneObj[key] = isObj(obj[key]) ? deepCopy(obj[key], hash) : obj[key];
      }    
      return cloneObj;
}

const cloneObj = deepCopy(obj);
console.log(cloneObj);

更多遺留問題,針對函數(shù)進(jìn)行拷貝,若是function,非箭頭函數(shù),如何解決?還有,若要拷貝原型鏈上的屬性?如何拷貝不可枚舉屬性? 如何拷貝Error對象等等的坑?

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

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

相關(guān)文章

  • 對深拷貝和淺拷貝的全面理解

    摘要:關(guān)于深拷貝和淺拷貝從原理看淺拷貝拷貝一層,對象級別的則拷貝引用深拷貝拷貝多層,每個(gè)層級的屬性都會(huì)拷貝從現(xiàn)象看復(fù)制了,被修改后,隨變化而變化淺拷貝不變深拷貝深拷貝針對的復(fù)雜的類型數(shù)據(jù)如直接賦值的單層拷貝,如,雖然不受的影響,但是這也不算做 關(guān)于深拷貝和淺拷貝 從原理看: 淺拷貝:拷貝一層,對象級別的則拷貝引用 深拷貝:拷貝多層,每個(gè)層級的屬性都會(huì)拷貝 從現(xiàn)象看:A復(fù)制了B,B被修改后...

    _DangJin 評論0 收藏0
  • JS的深淺拷貝

    摘要:引用類型之所以會(huì)出現(xiàn)深淺拷貝的問題,實(shí)質(zhì)上是由于對基本類型和引用類型的處理不同。另外方法可以視為數(shù)組對象的淺拷貝。上面描述過的復(fù)雜問題依然存在,可以說是最簡陋但是日常工作夠用的深拷貝方式。 一直想梳理下工作中經(jīng)常會(huì)用到的深拷貝的內(nèi)容,然而遍覽了許多的文章,卻發(fā)現(xiàn)對深拷貝并沒有一個(gè)通用的完美實(shí)現(xiàn)方式。因?yàn)閷ι羁截惖亩x不同,實(shí)現(xiàn)時(shí)的edge case過多,在深拷貝的時(shí)候會(huì)出現(xiàn)循環(huán)引用等問...

    xiaoxiaozi 評論0 收藏0
  • javascript的深拷貝VS淺拷貝

    摘要:深拷貝淺拷貝本文主要對深拷貝淺拷貝的解釋及實(shí)現(xiàn)做一下簡單記錄。之所以會(huì)有深拷貝與淺拷貝之分,是因?yàn)椴煌瑪?shù)據(jù)類型的數(shù)據(jù)在內(nèi)存中的存儲(chǔ)區(qū)域不一樣。但注意,只能做一層屬性的淺拷貝。 深拷貝VS淺拷貝 本文主要對深拷貝&淺拷貝的解釋及實(shí)現(xiàn)做一下簡單記錄。原文鏈接,歡迎star。 之所以會(huì)有深拷貝與淺拷貝之分,是因?yàn)椴煌瑪?shù)據(jù)類型的數(shù)據(jù)在內(nèi)存中的存儲(chǔ)區(qū)域不一樣。 堆和棧是計(jì)算機(jī)中劃分出來用來存儲(chǔ)的...

    Nekron 評論0 收藏0
  • 一篇文章理解JS數(shù)據(jù)類型、深拷貝和淺拷貝

    摘要:接下來我們進(jìn)入正片數(shù)據(jù)類型六種基本數(shù)據(jù)類型布爾值,和一個(gè)表明值的特殊關(guān)鍵字。一種數(shù)據(jù)類型,它的實(shí)例是唯一且不可改變的。在中是沒有方法是可以改變布爾值和數(shù)字的。參考資料深拷貝淺拷貝 前言 筆者最近整理了一些前端技術(shù)文章,如果有興趣可以參考這里:muwoo blogs。接下來我們進(jìn)入正片: js 數(shù)據(jù)類型 六種 基本數(shù)據(jù)類型: Boolean. 布爾值,true 和 false. nu...

    EddieChan 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<