最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解lodash中的cloneDeep使用細(xì)節(jié)

 更新時間:2023年01月26日 09:30:50   作者:flyingbird  
這篇文章主要為大家介紹了詳解lodash中的cloneDeep使用細(xì)節(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

lodash中的cloneDeep是一個使用頻率比較高的方法,然而你真的理解其中的細(xì)節(jié)處理嗎?如果下面幾個問題你還有疑惑那么本文對你或多或少有些幫助。

  • cloneDeep中支持拷貝函數(shù)、Error對象、DOM節(jié)點以及WeakMap對象嗎?
  • cloneDeep中使用了哪種算法呢?
  • 瀏覽器中提供的實現(xiàn)深拷貝的方式除了JSON.parse(JSON.stringify()),還有其他方法嗎?
  • 當(dāng)遇到循環(huán)引用時,如何進(jìn)行深拷貝操作來避免出現(xiàn)棧溢出呢?

當(dāng)上面這些問題你還有疑惑時,可能會在一些比較少見的場景中遇到一些出乎意料的問題,希望本文能夠?qū)δ阌兴鶐椭?/p>

支持的數(shù)據(jù)類型

lodash中支持了很多種的數(shù)據(jù)類型,包括 arrays、array buffers、 booleans、 date objects、maps、 numbers、Object、regexes、sets、 strings、symbols、typed arrays,以及包括arguments這個參數(shù)(不過拷貝后會丟失一些信息)。

但是由于一些原因,還有一些類型,lodash中默認(rèn)時不支持的。至于error objects、functions、DOM nodes、以及WeakMaps默認(rèn)是不支持的,lodash默認(rèn)會返回一個控對象,所以如果數(shù)據(jù)中存在這些數(shù)據(jù)類型時需要特別關(guān)注一下,拷貝之后就無法獲取對應(yīng)的數(shù)據(jù)了。

cloneDeepWith

如果拷貝的數(shù)據(jù)中存在不支持的數(shù)據(jù)類型時,我們改怎么辦呢?

lodash為我們提供了另外一個方法,與cloneDeep比較類似,只不過我們可以在這個方法中傳入一個自定義函數(shù),當(dāng)遇到不支持的數(shù)據(jù)類型時,我們可以根據(jù)場景來定義自己的深拷貝的實現(xiàn)邏輯。比如說當(dāng)拷貝函數(shù)時,返回函數(shù)本身等。

lodash官網(wǎng) 有著比較詳細(xì)的例子,也可以參考一下。

拷貝算法介紹

lodash作為一個使用非常廣泛的庫,在拷貝算法上使用了structured clone algorithm,這個算法細(xì)節(jié)描述可以參考 html.spec.whatwg.org/multipage/s… ,與目前瀏覽器中的structuredClone方法實現(xiàn)采用的是一樣的算法,在其他一些場景中大家進(jìn)行拷貝方式的實現(xiàn)基本是一致的,這也保證了使用cloneDeep方法具有良好的兼容性。

structuredClone VS cloneDeep

目前瀏覽器中提供了structuredClone 方法來處理需要深拷貝的場景,那我們還需要使用lodash提供的cloneDeep方法嗎?從目前來看這個API在web場景的兼容性:

目前看來兼容性還不是特別高,大家可以根據(jù)自己的場景來進(jìn)行選用,畢竟使用lodash會增加包體積大小,對于一些追求極致性能的場景包體積肯定越小越好。

循環(huán)引用處理方法

在處理拷貝過程中一般都會遇到一個比較棘手的問題:循環(huán)引用, 看下面這段簡單的代碼:

const objb = {
  b: null
};
const obja = {
  a: objb
};
objb.b = obja;
console.log(objb);

在控制臺中輸出objb對象,展開其屬性,我們可以看到這個結(jié)果:

可以看到objb對象的屬性可以無限展開下去,這樣就形成了循環(huán)引用。形成循環(huán)引用的原因就是,objb.b引用了obja對象;但是obja.a屬性又引用了objb對象。

如果我們進(jìn)行不斷的拷貝而不做針對循環(huán)引用的處理,必然會出現(xiàn)這個錯誤:

那么lodash中是如何處理這個問題的呢?

其實lodash中處理循環(huán)引用的方法非常簡單清晰,下面這段代碼是處理循環(huán)引用的核心代碼??梢钥闯鰈odash中主要通過緩存每個值對應(yīng)的拷貝結(jié)果來解決循環(huán)引用的問題。

針對上面的這個存在循環(huán)引用的對象,我們可以來按步驟進(jìn)行分析一下cloneDeep(objb)時是如何解決循環(huán)引用的:

  • 處理objb對象,stack.get(objb)不存在,所以將代表objb的拷貝結(jié)果result放到stack中,然后逐個處理objb上的屬性
  • 處理objb中的b屬性,stack.get(obj.b)其實也就是stack.get(obja),此時stacka也在stack中,因此也將代表obja的拷貝結(jié)果result放置到stack中,然后逐個處理obja上的屬性
  • 處理obja上的a屬性,stack.get(obja.a)其實也就是stack.get(objb),經(jīng)過前兩步的處理,我們只在此時,objb已經(jīng)存在stack中了,stack.get(objb)返回一個拷貝后的對象

拷貝過程結(jié)束,返回拷貝的結(jié)果 可以結(jié)合下面這幅圖來進(jìn)行理解:

總結(jié)

深拷貝看起來簡單,但是實現(xiàn)中有很多細(xì)節(jié)需要注意,lodash這類工具庫確實幫我們解決了不少問題,感謝開源!

以上就是詳解lodash中的cloneDeep使用細(xì)節(jié)的詳細(xì)內(nèi)容,更多關(guān)于lodash cloneDeep使用的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用pnpm包管理器替代npm及yarn的命令示例

    使用pnpm包管理器替代npm及yarn的命令示例

    這篇文章主要為大家介紹了使用pnpm包管理器替代npm及yarn的命令示例使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 帶你徹底理解JavaScript中的原型對象

    帶你徹底理解JavaScript中的原型對象

    這篇文章主要介紹了帶你徹底理解JavaScript中的原型對象,文中有詳細(xì)的代碼介紹,對正在學(xué)習(xí)js的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-04-04
  • 微信小程序 switch組件詳解及簡單實例

    微信小程序 switch組件詳解及簡單實例

    這篇文章主要介紹了微信小程序 switch組件詳解及簡單實例 的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • JavaScript嚴(yán)格模式不支持八進(jìn)制的問題講解

    JavaScript嚴(yán)格模式不支持八進(jìn)制的問題講解

    這篇文章主要講解JavaScript嚴(yán)格模式不支持八進(jìn)制的問題,本文圍繞JavaScript嚴(yán)格模式展開內(nèi)容,詳細(xì)介紹為什么JavaScript嚴(yán)格模式不支持八進(jìn)制,下面來看看詳細(xì)介紹,需要的朋友可以參考一下
    2021-11-11
  • 基于JavaScript獲取base64圖片大小

    基于JavaScript獲取base64圖片大小

    這篇文章主要介紹了基于JavaScript獲取base64圖片大小,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • 微信小程序 彈框和模態(tài)框?qū)崿F(xiàn)代碼

    微信小程序 彈框和模態(tài)框?qū)崿F(xiàn)代碼

    這篇文章主要介紹了微信小程序 彈框和模態(tài)框?qū)崿F(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • package.json中browser?module?main字段優(yōu)先級對比

    package.json中browser?module?main字段優(yōu)先級對比

    這篇文章主要介紹了package.json中browser?module?main字段的優(yōu)先級詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Astro Islands靜態(tài)頁面交互式UI組件

    Astro Islands靜態(tài)頁面交互式UI組件

    這篇文章主要為大家介紹了Astro Islands靜態(tài)頁面交互式UI組件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Wireshark基本介紹和學(xué)習(xí)TCP三次握手

    Wireshark基本介紹和學(xué)習(xí)TCP三次握手

    本文主要介紹Wireshark基本介紹和學(xué)習(xí)TCP三次握手,這里詳細(xì)整理了相關(guān)資料,并給出詳細(xì)流程,有需要的小伙伴可以參考下
    2016-08-08
  • 避免地獄async?await的使用及原理解析

    避免地獄async?await的使用及原理解析

    這篇文章主要為大家介紹了避免地獄async?await的使用場景及原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07

最新評論

含山县| 黄山市| 谢通门县| 常宁市| 涟源市| 巫溪县| 盐源县| 上栗县| 龙江县| 澜沧| 天柱县| 邓州市| 凤台县| 松江区| 花莲市| 甘孜县| 大港区| 宜昌市| 阿图什市| 堆龙德庆县| 长子县| 宜川县| 漳平市| 满洲里市| 车致| 黔江区| 青海省| 响水县| 达尔| 江都市| 五莲县| 门源| 商河县| 九龙县| 裕民县| 衡水市| 济阳县| 浠水县| 柯坪县| 抚宁县| 肥西县|