亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript使用structuredClone實現(xiàn)深拷貝

 更新時間:2024年03月05日 08:53:00   作者:南城FE  
在JavaScript中,實現(xiàn)深拷貝的方式有很多種,每種方式都有其優(yōu)點和缺點,今天介紹一種原生JavaScript提供的structuredClone實現(xiàn)深拷貝,文中通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下

前言

在JavaScript中,實現(xiàn)深拷貝的方式有很多種,每種方式都有其優(yōu)點和缺點。今天介紹一種原生JavaScript提供的structuredClone實現(xiàn)深拷貝。

下面列舉一些常見的方式,以及它們的代碼示例和優(yōu)缺點:

1. 使用JSON.parse(JSON.stringify(obj))

代碼示例:

function deepClone(obj) {
    return JSON.parse(JSON.stringify(obj));
}

優(yōu)點:簡單易行,對于大多數(shù)對象類型有效。

缺點:不能復制原型鏈,對于包含循環(huán)引用的對象可能出現(xiàn)問題。比如以下代碼:

const calendarEvent = {
  date: new Date()
}

const problematicCopy = JSON.parse(JSON.stringify(calendarEvent))

最終得到的date不是Data對象,而是字符串。

{
    "date": "2024-03-02T03:43:35.890Z"
}

這是因為JSON.stringify只能處理基本的對象、數(shù)組。任何其他類型都沒有按預期處理。例如,日期轉(zhuǎn)換為字符串。Set/Map只是轉(zhuǎn)換為{}

const kitchenSink = {
  set: new Set([1, 3, 3]),
  map: new Map([[1, 2]]),
  regex: /foo/,
  deep: { array: [ new File(someBlobData, 'file.txt') ] },
  error: new Error('Hello!')
}

const veryProblematicCopy = JSON.parse(JSON.stringify(kitchenSink))

最終得到如下數(shù)據(jù):

{
  "set": {},
  "map": {},
  "regex": {},
  "deep": {
    "array": [
      {}
    ]
  },
  "error": {},
}

2. 使用遞歸

代碼示例:

function deepClone(obj) {
    if (obj === null || typeof obj !== 'object') {
        return obj;
    }
    let clone = obj.constructor();
    for (let attr in obj) {
        if (obj.hasOwnProperty(attr)) {
            clone[attr] = this.deepClone(obj[attr]);
        }
    }
    return clone;
}

優(yōu)點:對于任何類型的對象都有效,包括循環(huán)引用。

缺點:對于大型對象可能會消耗大量內(nèi)存,并可能導致堆棧溢出。

3. 第三方庫,如 lodash 的 _.cloneDeep 方法

代碼示例:

const _ = require('lodash');
function deepClone(obj) {
    return _.cloneDeep(obj);
}

優(yōu)點:支持更多類型的對象和庫,例如,支持 Proxy 對象。

缺點:會引入依賴導致項目體積增大。

因為這個函數(shù)會導致17.4kb的依賴引入,如果只是引入lodash會更高。

4. 現(xiàn)代深拷貝structuredClone

在現(xiàn)代瀏覽器中,可以使用 structuredClone 方法來實現(xiàn)深拷貝,它是一種更高效、更安全的深拷貝方式。

以下是一個示例代碼,演示如何使用 structuredClone 進行深拷貝:

const kitchenSink = {
  set: new Set([1, 3, 3]),
  map: new Map([[1, 2]]),
  regex: /foo/,
  deep: { array: [ new File(someBlobData, 'file.txt') ] },
  error: new Error('Hello!')
}
kitchenSink.circular = kitchenSink

const clonedSink = structuredClone(kitchenSink)

structuredClone可以做到:

  • 拷貝無限嵌套的對象和數(shù)組
  • 拷貝循環(huán)引用
  • 拷貝各種各樣的JavaScript類型,如DateSetMap、Error、RegExp、ArrayBuffer、Blob、FileImageData

哪些不能拷貝:

  • 函數(shù)
  • DOM節(jié)點
  • 屬性描述、settergetter
  • 對象原型鏈

所支持的完整列表:

Array、ArrayBufferBoolean、DataView、DateError類型(下面具體列出的類型)、Map、Object,但僅限于普通對象、原始類型,除了symbol(又名numberstring、nullundefined、boolean、BigInt)、RegExpSet、TypedArray

Error類型:

Error, EvalError, RangeError, ReferenceError , SyntaxError, TypeError, URIError

Web/API類型:

AudioData, Blob, CryptoKey, DOMException, DOMMatrix, DOMMatrixReadOnly, DOMPoint, DomQuad, DomRect, File, FileList, FileSystemDirectoryHandle, FileSystemFileHandle, FileSystemHandle, ImageBitmap, ImageData, RTCCertificate, VideoFrame

值得慶幸的是 structuredClone 在所有主流瀏覽器中都受支持,也支持Node.js和Deno。

最后

我們現(xiàn)在終于可以直接使用原生JavaScript中的structuredClone能力實現(xiàn)深度拷貝對象。每種方式都有其優(yōu)缺點,具體使用方式取決于你的需求和目標對象的類型。

以上就是JavaScript使用structuredClone實現(xiàn)深拷貝的詳細內(nèi)容,更多關(guān)于JavaScript structuredClone深拷貝的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaScript利用Date實現(xiàn)簡單的倒計時實例

    JavaScript利用Date實現(xiàn)簡單的倒計時實例

    在日常開發(fā)的時候經(jīng)常遇到關(guān)于倒計時的需求,下面這篇文章就給主要介紹了JavaScript利用Date實現(xiàn)倒計時效果的方法示例,文中主要實現(xiàn)了倒計時和倒計時結(jié)束搶購的按鈕才可以被點擊的效果,有需要的朋友可以參考借鑒。
    2017-01-01
  • html中鼠標滾輪事件onmousewheel的處理方法

    html中鼠標滾輪事件onmousewheel的處理方法

    下面小編就為大家?guī)硪黄猦tml中鼠標滾輪事件onmousewheel的處理方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • JS實現(xiàn)數(shù)組扁平化的8種方式總結(jié)

    JS實現(xiàn)數(shù)組扁平化的8種方式總結(jié)

    數(shù)組扁平化指的是將一個多層嵌套的數(shù)組,處理成只有一層的數(shù)組,本文為大家整理了8個常用的JS實現(xiàn)數(shù)組扁平化的方法,希望對大家有所幫助
    2023-08-08
  • 基于javascript實現(xiàn)簡單的抽獎系統(tǒng)

    基于javascript實現(xiàn)簡單的抽獎系統(tǒng)

    這篇文章主要為大家詳細介紹了基于javascript實現(xiàn)簡單的抽獎系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • JavaScript實現(xiàn)數(shù)值自動增加動畫

    JavaScript實現(xiàn)數(shù)值自動增加動畫

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)數(shù)值自動增加動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • JavaScript實現(xiàn)簡單動態(tài)表格

    JavaScript實現(xiàn)簡單動態(tài)表格

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)簡單動態(tài)表格,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 微信小程序播放背景音樂的實例代碼

    微信小程序播放背景音樂的實例代碼

    這篇文章主要介紹了微信小程序播放背景音樂,實現(xiàn)原理是通過wx.getBackgroundAudioManager獲取全局唯一的背景音頻管理器,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2022-01-01
  • JavaScript實現(xiàn)彈窗效果代碼分析

    JavaScript實現(xiàn)彈窗效果代碼分析

    本文主要介紹了JavaScript實現(xiàn)彈窗效果的代碼分析,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • 微信小程序使用form表單獲取輸入框數(shù)據(jù)的實例代碼

    微信小程序使用form表單獲取輸入框數(shù)據(jù)的實例代碼

    這篇文章主要介紹了微信小程序使用form表單獲取輸入框數(shù)據(jù)的實例代碼,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • js實現(xiàn)省市聯(lián)動效果的簡單實例

    js實現(xiàn)省市聯(lián)動效果的簡單實例

    本篇文章主要是對js實現(xiàn)省市聯(lián)動效果的簡單實例進行了介紹,需要的朋友可以過來,希望對大家有所幫助
    2014-02-02

最新評論