摘要:相信人很多學習的過程中都踩了深拷貝和淺拷貝的坑,深拷貝和淺拷貝的區別我就不再贅述了,今天我來寫一下我自己實現深拷貝的各種方法。中的深拷貝也是用類似方法實現。
相信人很多學習js的過程中都踩了深拷貝和淺拷貝的坑,深拷貝和淺拷貝的區別我就不再贅述了,今天我來寫一下我自己實現深拷貝的各種方法。
比較簡單的拷貝方式可以借用瀏覽器的Json對象去實現,先把對象轉化為json字符串,在解析回對象實現深拷貝。具體代碼就是JSON.parse(JSON.stringify(target));但是這種比較hack的方法總歸不是正途,現在我就來貼兩種我自己寫的深拷貝代碼。
function deepClone(currobj){ if(typeof currobj !== "object"){ return currobj; } if(currobj instanceof Array){ var newobj = []; }else{ var newobj = {} } for(var key in currobj){ if(typeof currobj[key] !== "object"){ newobj[key] = currobj[key]; }else{ newobj[key] = deepClone(currobj[key]) } } return newobj }
第一種自然就是遞歸,遍歷對象的每一個屬性然后賦值到新對象了,若是有深層次嵌套的對象,遞歸執行函數。jq中的深拷貝也是用類似方法實現。
function deepClone(currobj){ if(typeof currobj !== "object"){ return currobj; } if(currobj instanceof Array){ var newobj = []; }else{ var newobj = {} } var currQue = [currobj], newQue = [newobj]; while(currQue.length){ var obj1 = currQue.shift(),obj2 = newQue.shift(); for(var key in obj1){ if(typeof obj1[key] !== "object"){ obj2[key] = obj1[key]; }else{ if(obj1[key] instanceof Array ){ obj2[key] = []; }else{ obj2[key] = {} }; currQue.push(obj1[key]); newQue.push(obj2[key]); } } } return newobj; };
上一種遞歸的方式容易引起內存溢出,特別是對一個比較復雜,層級很深的對象進行深拷貝。所以第二種方法是用循環去拷貝次級的對象,用兩個隊列去保存需要拷貝的對象和拷貝目標,利用淺拷貝的原理實現了深拷貝。
但是有時候對象會存在子屬性指向自身的問題,形成對象環,我這暫時還沒有考慮到。
突然看到自己這篇文章,其實對象環的問題只需要別將舊數組出棧就行了具體代碼:
function deepClone(currobj){ if(typeof currobj !== "object"){ return currobj; } if(currobj instanceof Array){ var newobj = []; }else{ var newobj = {} } var currQue = [currobj], newQue = [newobj], i = 0; while(i <= currQue.length - 1){ var obj1 = currQue[i++],obj2 = newQue.shift(); for(var key in obj1){ if(typeof obj1[key] !== "object"){ obj2[key] = obj1[key]; }else{ if(currQue.includes(obj1[key])){ obj2[key] = obj1[key]; continue; } if(obj1[key] instanceof Array ){ obj2[key] = []; }else{ obj2[key] = {} }; currQue.push(obj1[key]); newQue.push(obj2[key]); } } } return newobj; };
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/81270.html
摘要:深拷貝和淺拷貝問題的本質還是不同數據類型的存儲方式差異,尤其是引用數據類型的特殊。 深拷貝和淺拷貝問題的本質還是不同數據類型的存儲方式差異,尤其是引用數據類型的特殊。showImg(https://segmentfault.com/img/bVbb8XH?w=1058&h=409); 現分別對賦值、淺拷貝、深拷貝做深入研究: 1.賦值 原理:直接將對象指針直接賦值給另一個變量 代碼: ...
摘要:地址傳遞引用類型則是地址傳遞,將存放在棧內存中的地址賦值給接收的變量。即對象的淺拷貝會對主對象進行拷貝,但不會復制主對象里面的對象。 相關知識點 1.javascript變量包含兩種不同數據類型的值:基本類型和引用類型。 基本類型值指的是簡單的數據段,包括es6里面新增的一共是有6種,具體如下:number、string、boolean、null、undefined、symbol。 引...
摘要:而堆內存主要負責像對象這種變量類型的存儲,如下圖引用類型中復制淺拷貝的只是棧內存中的指針,指向同一個堆內存的對象如何實現深拷貝最簡單的方法就是與方法 淺拷貝只會在引用類型中出現 基本數據類型有哪些,number,string,boolean,null,undefined,symbol以及未來ES10新增的BigInt(任意精度整數)七類。 引用數據類型(Object類)有常規名值對的無...
摘要:原文在這篇文章中我們將會討論中對象拷貝的多種方式。因此,根據你的用法需要特別注意的對象拷貝。在擁有權限的情況下,通知立即關閉。在中深拷貝不幸的是,結構化拷貝算法目前僅適用于基于瀏覽器的應用。 原文:COPYING OBJECTS IN JAVASCRIPT在這篇文章中我們將會討論 Javascript 中對象拷貝的多種方式。包括深拷貝和淺拷貝。開始之前,先談一些基礎知識: Javasc...
閱讀 2596·2023-04-25 15:07
閱讀 705·2021-11-24 10:21
閱讀 2299·2021-09-22 10:02
閱讀 3517·2019-08-30 15:43
閱讀 3222·2019-08-30 13:03
閱讀 2287·2019-08-29 17:18
閱讀 3586·2019-08-29 17:07
閱讀 1873·2019-08-29 12:27