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