摘要:對于深拷貝,淺拷貝的概念不多說,概念可以自行百度喲這里對深拷貝對象進(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)于深拷貝和淺拷貝從原理看淺拷貝拷貝一層,對象級別的則拷貝引用深拷貝拷貝多層,每個(gè)層級的屬性都會(huì)拷貝從現(xiàn)象看復(fù)制了,被修改后,隨變化而變化淺拷貝不變深拷貝深拷貝針對的復(fù)雜的類型數(shù)據(jù)如直接賦值的單層拷貝,如,雖然不受的影響,但是這也不算做 關(guān)于深拷貝和淺拷貝 從原理看: 淺拷貝:拷貝一層,對象級別的則拷貝引用 深拷貝:拷貝多層,每個(gè)層級的屬性都會(huì)拷貝 從現(xiàn)象看:A復(fù)制了B,B被修改后...
摘要:引用類型之所以會(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)引用等問...
摘要:深拷貝淺拷貝本文主要對深拷貝淺拷貝的解釋及實(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ǔ)的...
摘要:接下來我們進(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...
閱讀 3005·2021-10-13 09:39
閱讀 2702·2021-09-27 13:34
閱讀 2041·2019-08-30 15:55
閱讀 3268·2019-08-30 15:43
閱讀 3646·2019-08-30 11:16
閱讀 1762·2019-08-26 18:28
閱讀 1298·2019-08-26 13:56
閱讀 923·2019-08-26 13:35