摘要:深復(fù)制實(shí)現(xiàn)代碼如下第一種方法通過遞歸解析解決第二種方法通過解析解決作者六師兄鏈接原生深拷貝的實(shí)現(xiàn)處理未輸入新對(duì)象的情況通過方法構(gòu)造新的對(duì)象
深淺拷貝針對(duì)的是 對(duì)象類型,如果是字符串的數(shù)組用[...arr],還是不會(huì)影響
要區(qū)分針對(duì)數(shù)組的深淺拷貝(默認(rèn)情況為里面沒有對(duì)象的數(shù)組),與針對(duì)對(duì)象的深淺拷貝
JavaScript數(shù)組深拷貝和淺拷貝的兩種方法
let a1 = [1, 2]; let a2 = a1; a2[0] = 2; a1 // [2, 2] 這個(gè)是復(fù)制了指向底層數(shù)據(jù)結(jié)構(gòu)的指針 -- let a1 = [1, 2]; let a2 = [...a1]; 這個(gè)是a1會(huì)返回原數(shù)組的克隆,再修改a2就不會(huì)對(duì)a1產(chǎn)生影響 -- let a1 = [{foo:1}]; let a2 = [...a1]; a1[0].foo=2 a2[0].foo ===>2 這時(shí)a1數(shù)組里是對(duì)象,a2克隆過去的話,對(duì)象里的值還是會(huì)隨著修改 深拷貝普遍的方法是對(duì)對(duì)象的子對(duì)象進(jìn)行遞歸拷貝 // 遞歸實(shí)現(xiàn)一個(gè)深拷貝 function deepClone(source){ if(!source || typeof source !== "object"){ throw new Error("error arguments", "shallowClone"); } var targetObj = source.constructor === Array ? [] : {}; for(var keys in source){ if(source.hasOwnProperty(keys)){ if(source[keys] && typeof source[keys] === "object"){ targetObj[keys] = source[keys].constructor === Array ? [] : {}; targetObj[keys] = deepClone(source[keys]); }else{ targetObj[keys] = source[keys]; } } } return targetObj; } 有一個(gè)用JSON對(duì)象中的parse和stringify來實(shí)現(xiàn)深拷貝 但是源對(duì)象的方法在拷貝的過程中丟失了,這是因?yàn)樵谛蛄谢疛avaScript對(duì)象時(shí),所有函數(shù)和原型成員會(huì)被有意忽略 // 利用JSON序列化實(shí)現(xiàn)一個(gè)深拷貝 function deepClone(source){ return JSON.parse(JSON.stringify(source)); } var o1 = { arr: [1, 2, 3], obj: { key: "value" }, func: function(){ return 1; } }; var o2 = deepClone(o1); console.log(o2); // => {arr: [1,2,3], obj: {key: "value"}}
js 深拷貝 vs 淺拷貝 思維導(dǎo)圖
對(duì)于字符串類型,淺復(fù)制是對(duì)值的復(fù)制,對(duì)于對(duì)象來說,淺復(fù)制是對(duì)對(duì)象地址的復(fù)制,并沒 有開辟新的棧,也就是復(fù)制的結(jié)果是兩個(gè)對(duì)象指向同一個(gè)地址,修改其中一個(gè)對(duì)象的屬性,則另一個(gè)對(duì)象的屬性也會(huì)改變,而深復(fù)制則是開辟新的棧,兩個(gè)對(duì)象對(duì)應(yīng)兩個(gè)不同的地址,修改一個(gè)對(duì)象的屬性,不會(huì)改變另一個(gè)對(duì)象的屬性。深復(fù)制實(shí)現(xiàn)代碼如下:
第一種方法、通過遞歸解析解決
第二種方法:通過JSON解析解決
作者:六師兄Leon
鏈接:https://www.zhihu.com/questio...
JavaScript 原生js深拷貝的實(shí)現(xiàn)
function deepCopy(initalObject,finalObject){ var finalObject = finalObject || {} // 處理未輸入新對(duì)象的情況 for(var key in initalObject){ if(initalObject[key] === initalObject){ continue } if(typeof initalObject[key] === "object"){ finalObject[key] = (initalObject[key].constructor === Array) ? [] : Object.create(initalObject[key]) //通過Object.create()方法構(gòu)造新的對(duì)象 }else{ finalObject[key] = initalObject[key] } } return finalObject }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/102468.html
摘要:在之前的文章專題之?dāng)?shù)據(jù)類型和類型檢測(cè)中我有講過,中的數(shù)據(jù)類型分為兩種,基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,基本數(shù)據(jù)類型是保存在棧的數(shù)據(jù)結(jié)構(gòu)中的是按值訪問,所以不存在深淺拷貝問題。 前言 在開發(fā)過程中,偶爾會(huì)遇到這種場(chǎng)景,拿到一個(gè)數(shù)據(jù)后,你打算對(duì)它進(jìn)行處理,但是你又希望拷貝一份副本出來,方便數(shù)據(jù)對(duì)比和以后恢復(fù)數(shù)據(jù)。 那么這就涉及到了 JS 中對(duì)數(shù)據(jù)的深淺拷貝問題,所謂深淺拷貝,淺拷貝的意思就是,...
摘要:深拷貝相比于淺拷貝速度較慢并且花銷較大。所以在賦值完成后,在棧內(nèi)存就有兩個(gè)指針指向堆內(nèi)存同一個(gè)數(shù)據(jù)。結(jié)果如下擴(kuò)展運(yùn)算符只能對(duì)一層進(jìn)行深拷貝如果拷貝的層數(shù)超過了一層的話,那么就會(huì)進(jìn)行淺拷貝那么我們可以看到和展開原算符對(duì)于深淺拷貝的結(jié)果是一樣。 JS中數(shù)據(jù)類型 基本數(shù)據(jù)類型: undefined、null、Boolean、Number、String和Symbol(ES6) 引用數(shù)據(jù)類型:...
摘要:好像栗子不是那么好吃,那我們來看看下面的解釋吧深淺拷貝深拷貝和淺拷貝只針對(duì)像這樣的引用類型數(shù)據(jù)。深拷貝則是開啟一個(gè)新的棧,兩個(gè)對(duì)象對(duì)應(yīng)兩個(gè)不同的引用地址,修改一個(gè)對(duì)象的屬性,不會(huì)改變另一個(gè)對(duì)象的屬性。 拷貝顧名思義就是復(fù)制,但是它并不簡單哦,拷貝分為深淺拷貝,那么啥是深拷貝啥是淺拷貝呢,讓我們來舉個(gè)栗子,淺拷貝就是當(dāng)你拷貝別人的U盤里東西時(shí),卻沒有新建文件存放在自己的電腦里,直接在里面...
摘要:開門見山,有人叫對(duì)象的復(fù)制為深復(fù)制淺復(fù)制,也有人叫深拷貝淺拷貝。高級(jí)屬性修改深拷貝滿足對(duì)象的復(fù)制,淺拷貝影響原數(shù)組。關(guān)于對(duì)象的深淺拷貝,暫且探索到這里,后續(xù)有新發(fā)現(xiàn)再進(jìn)行補(bǔ)充。 showImg(https://segmentfault.com/img/remote/1460000014305581); 開門見山,有人叫對(duì)象的復(fù)制為深復(fù)制淺復(fù)制,也有人叫深拷貝淺拷貝。其實(shí)都是copy。 ...
摘要:正文討論深淺拷貝,首先要從的基本數(shù)據(jù)類型說起根據(jù)中的變量類型傳遞方式,分為值類型和引用類型,值類型變量包括。當(dāng)你拷貝的對(duì)象有多級(jí)的時(shí)候,就是深拷貝。數(shù)據(jù)不存在則對(duì)其拷貝。 前言: 本文主要閱讀對(duì)象:對(duì)深淺拷貝印象模糊對(duì)初級(jí)前端,想對(duì)js深淺拷貝聊一聊的中級(jí)前端。 如果是對(duì)這些有完整對(duì)認(rèn)知體系和解決方法的大佬,可以選擇略過。 正文: 討論深淺拷貝,首先要從js的基本數(shù)據(jù)類型說起: 根據(jù) J...
閱讀 3108·2021-09-22 15:54
閱讀 1991·2019-08-30 15:53
閱讀 2386·2019-08-29 16:33
閱讀 1510·2019-08-29 12:29
閱讀 1459·2019-08-26 11:41
閱讀 2508·2019-08-26 11:34
閱讀 3133·2019-08-23 16:12
閱讀 1494·2019-08-23 15:56