欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

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

代碼示例:

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

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

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

const calendarEvent = {
  date: new Date()
}

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

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

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

這是因?yàn)?code>JSON.stringify只能處理基本的對(duì)象、數(shù)組。任何其他類型都沒有按預(yù)期處理。例如,日期轉(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)點(diǎn):對(duì)于任何類型的對(duì)象都有效,包括循環(huán)引用。

缺點(diǎn):對(duì)于大型對(duì)象可能會(huì)消耗大量?jī)?nèi)存,并可能導(dǎo)致堆棧溢出。

3. 第三方庫(kù),如 lodash 的 _.cloneDeep 方法

代碼示例:

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

優(yōu)點(diǎn):支持更多類型的對(duì)象和庫(kù),例如,支持 Proxy 對(duì)象。

缺點(diǎn):會(huì)引入依賴導(dǎo)致項(xiàng)目體積增大。

因?yàn)檫@個(gè)函數(shù)會(huì)導(dǎo)致17.4kb的依賴引入,如果只是引入lodash會(huì)更高。

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

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

以下是一個(gè)示例代碼,演示如何使用 structuredClone 進(jì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!')
}
kitchenSink.circular = kitchenSink

const clonedSink = structuredClone(kitchenSink)

structuredClone可以做到:

  • 拷貝無(wú)限嵌套的對(duì)象和數(shù)組
  • 拷貝循環(huán)引用
  • 拷貝各種各樣的JavaScript類型,如Date、Set、Map、ErrorRegExp、ArrayBufferBlob、File、ImageData

哪些不能拷貝:

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

所支持的完整列表:

Array、ArrayBuffer、BooleanDataView、DateError類型(下面具體列出的類型)、Map、Object,但僅限于普通對(duì)象、原始類型,除了symbol(又名number、string、null、undefinedboolean、BigInt)、RegExp、Set、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能力實(shí)現(xiàn)深度拷貝對(duì)象。每種方式都有其優(yōu)缺點(diǎn),具體使用方式取決于你的需求和目標(biāo)對(duì)象的類型。

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

相關(guān)文章

  • javascript Object與Function使用

    javascript Object與Function使用

    Object instanceof Function 還是 Function instance of Object,是真是假,一一道來(lái)
    2010-01-01
  • js獲取瀏覽器的各種屬性

    js獲取瀏覽器的各種屬性

    本篇文章主要介紹了js獲取瀏覽器各種屬性的相關(guān)資料。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-04-04
  • 基于JS設(shè)計(jì)12306登錄頁(yè)面

    基于JS設(shè)計(jì)12306登錄頁(yè)面

    本文給大家分享一段js代碼實(shí)現(xiàn)12306登錄界面,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下
    2016-12-12
  • TypeScript的安裝、使用、自動(dòng)編譯的實(shí)現(xiàn)

    TypeScript的安裝、使用、自動(dòng)編譯的實(shí)現(xiàn)

    TypeScript是一種由微軟開發(fā)的開源、跨平臺(tái)的編程語(yǔ)言。這篇文章主要介紹了TypeScript的安裝、使用、自動(dòng)編譯的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2020-04-04
  • 二維碼圖片生成器QRCode.js簡(jiǎn)單介紹

    二維碼圖片生成器QRCode.js簡(jiǎn)單介紹

    這篇文章主要為大家簡(jiǎn)單介紹了二維碼圖片生成器QRCode.js,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 原生js實(shí)現(xiàn)數(shù)字字母混合驗(yàn)證碼的簡(jiǎn)單實(shí)例

    原生js實(shí)現(xiàn)數(shù)字字母混合驗(yàn)證碼的簡(jiǎn)單實(shí)例

    這篇文章主要介紹了原生js實(shí)現(xiàn)數(shù)字字母混合驗(yàn)證碼的簡(jiǎn)單實(shí)例,注釋很詳細(xì),感興趣的小伙伴們可以參考一下
    2015-12-12
  • 使用JavaScript校驗(yàn)URL的方法小結(jié)

    使用JavaScript校驗(yàn)URL的方法小結(jié)

    JavaScript中如何校驗(yàn)一個(gè)URL?最近遇到幾次需要校驗(yàn)URL的,所以本文給大家整理一下幾個(gè)校驗(yàn)URL的方法,文中有詳細(xì)的代碼講解和圖文參考,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-12-12
  • js彈出層永遠(yuǎn)居中實(shí)現(xiàn)思路及代碼

    js彈出層永遠(yuǎn)居中實(shí)現(xiàn)思路及代碼

    彈出層永遠(yuǎn)居中的方法有很多,在本文為大家詳細(xì)介紹下使用js是如何輕松實(shí)現(xiàn)的,喜歡的朋友可以參考下
    2013-11-11
  • JavaScript快速調(diào)試的兩個(gè)技巧

    JavaScript快速調(diào)試的兩個(gè)技巧

    這篇文章主要給大家介紹了關(guān)于JavaScript快速調(diào)試的兩個(gè)技巧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • JS加密解密之保存到桌面書簽

    JS加密解密之保存到桌面書簽

    漸進(jìn)式Web應(yīng)用是一種結(jié)合了網(wǎng)頁(yè)和原生移動(dòng)應(yīng)用(Native App)優(yōu)點(diǎn)的新型應(yīng)用開發(fā)模式,這篇文章給大家介紹JS加密解密之保存到桌面書簽的操作方法,感興趣的朋友跟隨小編一起看看吧
    2024-03-03

最新評(píng)論