<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      深入探索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 類型,如DateSetMapErrorRegExpArrayBufferBlobFileImageData

      哪些不能拷貝:

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

      所支持的完整列表:

      ArrayArrayBufferBooleanDataViewDateError類型(下面具體列出的類型)、MapObject,但僅限于普通對象、原始類型,除了symbol(又名numberstringnullundefinedbooleanBigInt)、RegExpSetTypedArray

      Error 類型:

      ErrorEvalErrorRangeErrorReferenceError , SyntaxErrorTypeErrorURIError

      Web/API 類型:

      AudioDataBlobCryptoKeyDOMExceptionDOMMatrixDOMMatrixReadOnlyDOMPointDomQuadDomRectFileFileListFileSystemDirectoryHandleFileSystemFileHandleFileSystemHandleImageBitmapImageDataRTCCertificateVideoFrame

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

      結語

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

      更多內容請看:https://mybj123.com/20631.html

      posted @ 2024-05-10 17:43  碼云筆記  閱讀(1119)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产午夜福利视频一区二区| 久久日韩在线观看视频| 午夜精品福利一区二区三| 高h纯肉无码视频在线观看| 日韩高清不卡一区二区三区| 狠狠色噜噜狠狠亚洲AV| 成人亚欧欧美激情在线观看| 91精品国产一二三产区| 国产麻豆9l精品三级站| 亚洲精品www久久久久久| 高清性欧美暴力猛交| 亚洲人成电影网站 久久影视| 中文字幕亚洲日韩无线码| 国产精品无遮挡猛进猛出| 国产盗摄xxxx视频xxxx| 衡南县| 国内偷自第一区二区三区| 亚洲欭美日韩颜射在线二| 视频一区二区不中文字幕| 亚洲最大在线精品| 九九热视频在线观看精品| 另类国产精品一区二区| 毛片av中文字幕一区二区| 超碰人人超碰人人| 国产在线中文字幕精品| 日本特黄特黄刺激大片| 亚洲天堂成人黄色在线播放| 免费十八禁一区二区三区| 欧美日韩不卡合集视频| 国产麻花豆剧传媒精品mv在线| 在线中文字幕国产精品| 日韩精品中文字一区二区| 少妇xxxxx性开放| 国产精品亚洲欧美大片在线看 | 又色又污又爽又黄的网站| 99福利一区二区视频| 国产精品一码二码三码四码| 久久久综合香蕉尹人综合网 | 又粗又硬又黄a级毛片| 91偷自国产一区二区三区| 女人被狂躁c到高潮|