文章編號:11561時間:2024-10-01人氣:
淺拷貝只是創建了一個新的對象,復制了原有對象的基本類型的值,而引用數據類型只拷貝了一層屬性,再深層的還是無法進行拷貝。如果其中一個對象改變了這個內存中的地址,肯定會影響到另一個對象
深拷貝則不同,對于復雜引用數據類型,將一個對象從內存中完整地拷貝出來一份給目標對象,并從堆內存中開辟一個全新的空間存放新對象,且新對象的修改并不會改變原對象,這兩個對象是相互獨立、不受影響的,徹底實現了內存上的分離
實現深拷貝,一般兩種方式方式:
使用(());
手動實現
(())版本()是最簡單的深拷貝方法,其實就是把一個對象序列化成為JSON的字符串,并將對象里面的內容轉換成字符串,最后再用()的方法將JSON字符串生成一個新的對象
constobj={name:nordon,info:{age:18}};//一行代碼實現深拷貝constcopyObj=((obj));雖然使用(())實現深拷貝非常簡單、便捷,但是其卻存在一些API層面的特點:
拷貝的對象的值中如果有函數、undefined、symbol這三種類型,經過序列化之后的字符串中這個鍵值對會消失
undefined、任意的函數以及symbol作為對象屬性值時()跳過(忽略)對它們進行序列化
轉換值如果有toJSON()函數,該函數返回什么值,序列化結果就是什么值,并且忽略其他屬性的值
拷貝Date引用類型會變成字符串
無法拷貝不可枚舉的屬性
無法拷貝對象的原型鏈
拷貝RegExp引用類型會變成空對象
對象中含有NaN、Infinity以及-Infinity,JSON序列化的結果會變成null
無法拷貝包含循環引用的對象(對象之間相互引用,形成無限循環),會拋出錯誤
手動實現由于(())實現深拷貝存在一定的不足,在業務開發中建議慎重使用,因此我們需要自己手動實現一版深拷貝
手動實現過程中需要解決的問題,也就是補齊(())不足的一個過程,上述已經闡述其不足,接下來直接上代碼:
細節在代碼中已注釋
//判斷是不是引用類型constisComplexDataType=(obj)=>{return(typeofobj===object||typeofobj===function)&&obj!==null}constdeepClone=function(obj,hash=newWeakMap()){//日期對象直接返回一個新的日期對象if(===Date)returnnewDate(obj);//正則對象直接返回一個新的正則對象if(===RegExp)returnnewRegExp(obj);//如果循環引用了就用weakMap來解決if((obj))(obj);letallDesc=(obj);//遍歷傳入參數所有鍵的特性letcloneObj=((obj),allDesc);//繼承原型鏈(obj,cloneObj);for((obj)){cloneObj[key]=isComplexDataType(obj[key])&&typeofobj[key]!==function?deepClone(obj[key],hash):obj[key];}returncloneObj;};在實際開發中有著豐富的應用場景,盡管你可能已經熟悉了它的基本用法,但其實它隱藏著更多實用特性。 這些特性往往在不經意間發揮作用,值得深入理解。 如果你覺得這個話題略顯枯燥,讓我們通過幾個有趣的場景來探索。 例如,深拷貝時,的deepCopy功能(如`((obj/arr))`)在處理引用類型數據時至關重要,它能確保新生成的對象與原對象在內存上獨立,互不影響。 在服務端數據存儲中,也十分關鍵。 比如,存儲的canvas模板數據和Vue-amap的SVG路徑信息,這時就需要序列化存儲。 另外,localStorage和sessionStorage存儲的數據必須先轉化為字符串,否則可能出現存儲失效的問題。 當從服務端接口獲取Canvas或SVG數據時,能幫助解析這些數據,并在和vue-amap等組件中正確渲染。 此外,還能過濾數據和格式化輸出,包括設置縮進,使其更易于閱讀。 不過,遇到自引用對象時,會拋出“cyclic object value”錯誤,這時需要特殊處理,比如使用庫。 對于具有相同屬性但順序不同的對象,的結果可能出乎意料,這需要額外注意。 在實際操作中,可能會遇到諸如數據庫存儲后屬性消失、axios請求參數undefined消失等問題,這可能是由于replacer函數的過濾、屬性設置或數據類型的特殊性導致的。 與localStorage的配合使用時,確保數據為字符串是關鍵。 通過上述內容,你應該對有了更深入的認識。 在遇到問題時,記得檢查replacer、對象屬性和數據類型,找出問題的根源。 加入我們的技術討論小組,一起交流學習,提升前端開發技能吧!
最近,用戶在使用 xuejianxianzun/PixivBatchDownloader 下載器時遇到了一個挑戰:大量文件抓取后,在導出結果時, 函數拋出了 Invalid string length 的錯誤。 問題源于數據處理過程中,當處理大量對象時,生成的字符串超過了JavaScript引擎的長度限制,通常為2的29次方,即約512MB。 為解決這個限制,一個解決方案是將數據分解。 原有的做法是將整個數據集轉換為一個字符串,現在改為逐個對象處理,將每個對象轉換為字符串并存儲在數組中。 這樣,每個字符串的長度都將大大減少,從而避免了單個字符串過長導致的錯誤。 另外,如果不進行格式化,還可以進一步減小字符串長度和生成文件的體積。 通過這些策略,我們可以有效應對處理大容量數據時的長度限制問題。
復制粘貼一下 ()三個參數的含義:
返回值:返回包含 JSON 文本的字符串。 從上面的參數說明中可以看到,第二個參數可以是一個函數或者數組,這給了我們很大的發揮空間。
stringify() 的第一個和第三個參數都好理解,所以下面主要說的是第二個參數。
當第二個參數為數組時,可作為條件篩選使用。 例如有如下對象:
如果我們只需要name屬性,則可以這樣:
這個特性只對對象的根屬性生效,例如:
即使第二層上也有name屬性,但在篩選時并不會選中。 當對一個數組進行轉換時,會篩選數組第一層的每個值,例如:
基本上數組的用法就是如此了。
函數的發揮空間是很大的,理所當然地用法也就比較多了。 當第二個參數為函數時,stringify() 會給函數傳遞兩個參數,參數值為每一個成員的鍵和值。 但跟數組參數不同的是,函數會處理所有層級上的每一個成員。 例如:
所有符合條件的內容都被修改了(注意『小紅』是『小剛』的下一層)。 正是因為函數的這個特性,我們可以很方便地實現一些可能比較麻煩的功能。 比如上面的例子,如果不使用 stringify() 方法而想要修改所有層級上的age屬性的值,就需要需要進行深循環。
上面的例子中,如果想要復制一份arr的數據,通常是進行深拷貝,但其實也可以使用stringify(),只需要配合 () 即可:
stringify() 不能處理值為函數的成員,當某個成員的值為函數時,在轉換過程中會被自動排除,例如:
同樣的,() 方法是不能處理函數格式的字符串的。
在JavaScript中,() 和 () 是處理JSON數據的兩個關鍵工具。() 有多種用法:
而 () 則用于解析JSON字符串,傳入自定義解析器提供靈活性,但需確保輸入字符串為有效JSON格式。 比如,如果字符串不符合JSON規范,會引發錯誤。
總結,使用這兩個方法時,要密切關注序列化和解析過程中可能遇到的循環引用、格式錯誤以及特殊類型轉換等問題。
內容聲明:
1、本站收錄的內容來源于大數據收集,版權歸原網站所有!
2、本站收錄的內容若侵害到您的利益,請聯系我們進行刪除處理!
3、本站不接受違法信息,如您發現違法內容,請聯系我們進行舉報處理!
4、本文地址:http://www.lmxpnzry.com/article/ef3323bf2e08bebd16b2.html,復制請保留版權鏈接!
在MATLAB中生成隨機數看似一項簡單的任務,但如果沒有適當的理解,它可能會導致不準確和不可重復的結果,本文將深入探討MATLAB隨機數生成中的常見陷阱,并提供技巧以避免這些陷阱并優化結果,通過遵循本文中的準則,您可以確保您的隨機數生成代碼產生準確且可重復的結果,陷阱1,使用不合適的隨機數生成器MATLAB提供多種隨機數生成器,每種生...。
互聯網資訊 2024-09-29 20:25:33
響應式布局隨著移動設備的普及,響應式布局已成為Web開發的必備功能,響應式布局允許網站在不同尺寸的屏幕上良好顯示,從臺式機到智能手機,這對于確保所有用戶獲得良好的體驗至關重要,無論他們使用何種設備,實現響應式布局有多種方法,包括,使用媒體查詢、使用Flexbox和Grid等CSS布局模塊,以及使用CSS框架,這些技術使Web開發人員能...。
本站公告 2024-09-28 13:56:40
TreeView控件是VB中用于顯示分層數據的強大工具,當樹視圖包含大量節點時,它可能會變得慢速和無響應,通過實施一些性能優化技術,可以顯著提高TreeView控件的速度和響應能力,1.減少節點計數TreeView控件性能的最大影響因素之一是節點數量,每個節點都需要應用程序創建、渲染和管理,這會消耗處理能力和內存,因此,盡量減少樹視圖...。
最新資訊 2024-09-25 15:19:34
簡介`afxMessageBox`函數是一個允許你在VisualC,應用程序中顯示消息框的函數,消息框是一種用戶界面元素,它用于向用戶顯示信息、警告或錯誤消息,它還可以用于獲取用戶輸入,如何使用`afxMessageBox`函數`afxMessageBox`函數的語法為,cppintafxMessageBox,constcharlp...。
最新資訊 2024-09-25 06:08:30
簡介在現代Web開發中,JavaScript應用程序變得越來越復雜,處理大量數據的需求也不斷增加,為了滿足這些要求,開發人員需要找到方法來提高應用程序的性能和響應能力,setInterval函數setInterval函數是一個內置的JavaScript函數,允許您以指定的間隔,以毫秒為單位,重復執行一段代碼,它通常用于創建定時器,在特...。
本站公告 2024-09-17 04:29:44
創建文件失敗是一個常見的Windows錯誤,通常由CreateFile函數引發,此函數用于訪問和創建文件和目錄,因此它在應用程序開發中至關重要,排查CreateFile錯誤排查CreateFile錯誤可能很困難,因為原因可能有多種,以下是一個詳盡的策略,可幫助您識別并解決這些錯誤,檢查路徑和文件名確保您正在使用的路徑和文件名有效,驗證...。
最新資訊 2024-09-14 20:08:43
>,一個航班抓取工具,可以從多個航空公司網站抓取航班信息,結語通過本文的介紹,相信大家已經對旅游網站的運作模式和免費下載旅游網站源碼有了更多的了解,如果你也想搭建一個旅游網站,不妨下載這些免費的源碼,并加以修改和定制,打造一個屬于你自己的旅游平臺,最后,祝大家都能旅途愉快,玩得盡興!...。
本站公告 2024-09-13 17:39:52
釋放負面情緒對于我們的身心健康至關重要,當我們壓抑或否認自己的負面情緒時,它們會累積并對我們的健康產生負面影響,釋放負面情緒可以幫助我們緩解壓力、改善心情、提高認知能力,甚至促進身體健康,有多種方法可以釋放負面情緒,以下是一些建議,1.正視你的情緒承認你的感受很重要,不要否認或壓抑它們,當你意識到自己感到難過、憤怒或沮喪時,不要試圖將...。
本站公告 2024-09-12 07:22:22
Socket編程是建立網絡通信的一種重要方法,通過使用socket,我們可以創建套接字,并在客戶端和服務器之間建立連接,本文將介紹如何使用LinuxSocket編程建立安全的網絡通信,一、Socket編程的基礎Socket是一個端點,它允許兩個或多個應用程序通過網絡進行通信,要使用Socket編程,我們需要創建套接字,并將其綁定到一個...。
技術教程 2024-09-12 05:14:02
在當今數字時代,網絡編程至關重要,它使我們能夠與遠程計算機通信、共享數據并提供在線服務,對于Windows來說,微軟提供了各種工具和API來支持網絡編程,使開發人員能夠創建強大的網絡應用程序,Windows網絡編程基礎Windows網絡編程的基礎建立在套接字編程之上,套接字是一種雙向通信通道,使應用程序能夠在網絡上發送和接收數據,Wi...。
本站公告 2024-09-10 04:28:49
substr,函數概述在PHP中,substr,函數用于截取字符串的一部分,它的語法如下,stringsubstr,string$string,int$start,int$length,其中,$string,要截取的字符串$start,截取開始位置,從0開始,$length,截取的長度,可省略,默認為字符串長度,$start,su...。
本站公告 2024-09-05 17:33:20
如何做一個免費的個人網站,下面是如何建立一個免費的個人網站,電腦,聯想天翼510S,系統,WindowsS10,軟件,微軟邊緣102.0.1245.441.在瀏覽器中搜索,免費空房間,或,免費個人網站,2.以,柯凡,為例,有很多免費空房間,只是隨便舉個例子,點擊進入官網,出現報名頁面,點擊立即體驗免費注冊,3.你找到后,可以直接分...。
技術教程 2024-09-02 02:41:00