成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一起聊聊 JavaScript 中的 structuredClone 現代深拷貝

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

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

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

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

代碼示例:

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

優點:簡單易行,對于大多數對象類型有效。

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

const calendarEvent = {
  date: new Date()
}

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

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

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

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

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))

最終得到如下數據:

{
  "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;
}

優點:對于任何類型的對象都有效,包括循環引用。

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

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

代碼示例:

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

優點:支持更多類型的對象和庫,例如,支持 Proxy 對象。

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

圖片圖片

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

4. 現代深拷貝structuredClone

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

以下是一個示例代碼,演示如何使用 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可以做到:

  • 拷貝無限嵌套的對象和數組
  • 拷貝循環引用
  • 拷貝各種各樣的JavaScript類型,如Date、Set、Map、Error、RegExp、ArrayBuffer、Blob、File、ImageData等

哪些不能拷貝:

  • 函數
  • DOM節點
  • 屬性描述、setter和getter
  • 對象原型鏈

所支持的完整列表:

Array、ArrayBuffer、Boolean、DataView、Date、Error類型(下面具體列出的類型)、Map、Object,但僅限于普通對象、原始類型,除了symbol(又名number、string、null、undefined、boolean、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。

圖片圖片

最后

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

參考

  • Deep Cloning Objects in JavaScript, the Modern Way(www.builder.io/blog/structured-clone)
  • mozilla structuredClone(developer.mozilla.org/zh-CN/docs/Web/API/structuredClone)
責任編輯:武曉燕 來源: 南城大前端
相關推薦

2024-08-02 08:43:24

JavaScript開發者工具箱深拷貝

2023-05-08 09:00:46

JSON深拷貝對象

2024-05-08 08:32:25

架構

2022-12-06 08:12:11

Java關鍵字

2021-07-16 12:33:24

Javascript深拷貝淺拷貝

2024-06-12 09:52:00

2023-10-26 08:38:43

SQL排名平分分區

2017-05-24 11:54:55

Javascript深拷貝

2022-10-08 00:00:05

SQL機制結構

2023-04-26 07:30:00

promptUI非結構化

2020-10-12 08:35:22

JavaScript

2023-08-10 08:28:46

網絡編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2023-06-30 08:18:51

敏捷開發模式

2022-05-24 08:21:16

數據安全API

2023-09-21 08:16:56

JDK 21向量計算計算

2023-09-10 21:42:31

2024-02-20 21:34:16

循環GolangGo

2021-08-27 07:06:10

IOJava抽象

2022-12-07 09:01:14

布局容器VStack?
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 五月激情婷婷六月 | 亚洲成人av在线播放 | 九九色综合 | 日本不卡在线视频 | 99久久久国产精品 | 中文av电影| 日韩视频免费看 | 亚洲精品国产一区 | 久久国产欧美日韩精品 | 成人在线精品视频 | 男女爱爱网站 | 国产免费一区二区三区 | 毛片在线免费 | 日韩色图在线观看 | 精品欧美一区二区三区久久久小说 | 日韩综合一区 | 正在播放国产精品 | 一级看片免费视频囗交动图 | 久久精品一级 | 成人亚洲一区 | 欧美在线观看一区二区 | 四虎影院欧美 | a级片网站| 在线黄色网 | 久久久999精品| 一区欧美 | 国产在线aa| www成人免费 | 男人av在线播放 | 五月天国产 | 精品视频一区二区在线观看 | 在线激情视频 | 曰批视频在线观看 | 欧美一区二区三区久久精品视 | 亚洲人人 | 欧美亚洲国产精品 | 一区二区不卡视频 | 亚洲一区二区三区免费在线观看 | 欧美乱大交xxxxx另类电影 | 久草新在线 | 亚洲第一免费播放区 |