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

JavaScript新特性structuredClone()深拷貝策略詳解

 更新時間:2025年06月04日 09:46:43   作者:watermelo37  
structuredClone()是瀏覽器和Node.js的原生API,底層使用更高效的 C++ 實現(xiàn),比起JS層的JSON.stringify/parse 組合,性能通常更好,這篇文章給大家介紹JavaScript新特性structuredClone()深拷貝策略,感興趣的朋友一起看看吧

JavaScript新特性structuredClone(),一行代碼優(yōu)化深拷貝策略

structuredClone()使用起來非常簡單:

const cloned = structuredClone(obj);

替代:

const cloned = JSON.parse(JSON.stringify(obj));

想知道structuredClone()除了深拷貝以外,還有哪些JSON.parse(JSON.stringify(obj))所沒有的功能嗎?比起JSON.parse(JSON.stringify(obj))有什么性能上的提升嗎?structuredClone()的環(huán)境限制有哪些?

本文會告訴你答案。

一、structuredClone()介紹

1、structuredClone()是什么

structuredClone() 是瀏覽器和 Node.js 的原生 API,底層使用更高效的 C++ 實現(xiàn),比起 JS 層的 JSON.stringify/parse 組合,性能通常更好。

在結構復雜/嵌套多時差異更明顯,不需要轉成字符串再解析,避免了冗余的編碼/解碼過程。

2、structuredClone()環(huán)境支持

在 Node.js 17+、Chrome 98+、Firefox 94+ 中支持。

3、structuredClone()不會拷貝的內容

不支持或無法克隆的類型/結構說明
函數(shù) (Function)無法克隆函數(shù)或方法
SymbolSymbol 屬性會被忽略
類實例的方法/原型鏈原型鏈不會保留,克隆后不是原類的實例
DOM 節(jié)點(如 Element、Node)不支持 DOM 對象(比如瀏覽器中的 HTML 元素)
Proxy 對象無法克隆代理對象(Proxy
WeakMap / WeakSet因其不可枚舉和弱引用特性,無法被克隆
函數(shù)作用域內的閉包變量本質上函數(shù)不能克隆,因此也無法保留閉包
不可序列化的 host 對象如瀏覽器特有的某些對象(如 Window, FileList

4、基礎案例

structuredClone()支持Map、Set、Blob、Date、File等JSON.parse(JSON.stringify(obj))不支持的類型:

const original = {
// 原始類型
string: 'Hello',
number: 123,
boolean: true,
null: null,
undefined: undefined, // JSON會丟失,structuredClone保留
// 日期對象 (JSON會轉為字符串,structuredClone保持為Date對象)
date: newDate('2023-06-15'),
// 正則表達式 (JSON會轉為空對象,structuredClone保持為RegExp對象)
regex: /pattern/g,
// 集合類型
map: newMap([['key', 'value']]),
set: newSet([1, 2, 3]),
// 二進制數(shù)據(jù)
arrayBuffer: newUint8Array([1, 2, 3]).buffer,
typedArray: newUint8Array([1, 2, 3]),
// 嵌套數(shù)組和對象
array: [1, 2, { nested: true }],
object: { nested: { deep: true } }
};
const clone = structuredClone(original);
// 驗證類型保持一致
console.log(clone.date instanceof Date);        // true
console.log(clone.regex instanceof RegExp);     // true
console.log(clone.map instanceof Map);          // true
console.log(clone.set instanceof Set);          // true
console.log(clone.arrayBuffer instanceof ArrayBuffer); // true
console.log(clone.typedArray instanceof Uint8Array);  // true
const clone2 = JSON.parse(JSON.stringify(original));
console.log(clone2.date instanceof Date); // false (變成字符串)
console.log(clone2.set instanceof Set); // false (變成數(shù)組)

5、structuredClone()的兼容性判斷

可以用如下代碼安全使用 structuredClone(),在不支持的環(huán)境里自動回退到 JSON 方案(雖然功能會弱一些):

function deepClone(obj) {
  if (typeof structuredClone === 'function') {
    return structuredClone(obj);
  } else {
    // fallback: JSON 克?。ㄗ⒁夤δ苡邢蓿?
    return JSON.parse(JSON.stringify(obj));
  }
}

二、 structuredClone()比JSON.parse(JSON.stringify(obj))有什么區(qū)別

1、對比表格

特性JSON.parse(JSON.stringify(obj))structuredClone(obj)
深拷貝
性能較慢(中間需要序列化+解析)更快(原生實現(xiàn))
支持循環(huán)引用報錯支持
支持類型豐富度僅支持普通對象、數(shù)組、字符串、數(shù)字、布爾、null支持更多類型(Map、Set、Blob、Date、File 等)
丟失信息會丟失函數(shù)、undefined、Symbol、日期、原型鏈等保留更多原始結構
錯誤處理易錯(如循環(huán)引用會直接拋錯)更安全,報錯更明確

2、循環(huán)引用

循環(huán)引用是對象內部相互引用,形成“閉環(huán)”的結構,比如:

const obj = {};
obj.self = obj;
const cloned = structuredClone(obj); 

如果用 JSON.stringify(obj) 就會報錯:TypeError: Converting circular structure to JSON。但 structuredClone() 就能正確處理

三、structuredClone()在性能上的提升

根據(jù)多個社區(qū)實測 benchmark(如 ?JSBench.me?、V8 團隊 blog 和真實項目測試):

  • 深層嵌套對象(10層以上):structuredClone() 明顯更快;
  • 包含 Map、Set、Date、ArrayBuffer 的復雜對象:structuredClone() 能直接處理,而 JSON 克隆則需要額外轉換或報錯;
  • 平均測試中 structuredClone() 比 JSON 快 1.5~5 倍,尤其在大型對象上提升更顯著。

四、結語

目前,structuredClone() 已被所有主流瀏覽器支持。它為深拷貝問題提供了一個簡單、高效的解決方案,快來擁抱這個JavaScript新特性吧。

到此這篇關于JavaScript新特性structuredClone()深拷貝策略詳解的文章就介紹到這了,更多相關js structuredClone()深拷貝內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • ExpressJS使用express-ws的實例詳解

    ExpressJS使用express-ws的實例詳解

    這篇文章主要介紹了ExpressJS使用express-ws的實例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • JavaScript數(shù)組及常見操作方法小結

    JavaScript數(shù)組及常見操作方法小結

    這篇文章主要介紹了JavaScript數(shù)組及常見操作方法,結合實例形式總結分析了JavaScript數(shù)組的基本獲取、添加、刪除、排序、翻轉等相關操作技巧,需要的朋友可以參考下
    2019-11-11
  • JavaScript中清空數(shù)組的幾種方法

    JavaScript中清空數(shù)組的幾種方法

    本文主要介紹了JavaScript中清空數(shù)組的幾種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • JavaScript中的object轉換函數(shù)toString()與valueOf()介紹

    JavaScript中的object轉換函數(shù)toString()與valueOf()介紹

    這篇文章主要介紹了JavaScript中的object轉換函數(shù)toString()與valueOf()介紹,需要的朋友可以參考下
    2014-12-12
  • jsPDF導出pdf示例

    jsPDF導出pdf示例

    這篇文章主要介紹了jsPDF如何導出pdf,不過其貌似不支持中文,需要的朋友可以參考下
    2014-05-05
  • javascript設計模式Constructor(構造器)模式

    javascript設計模式Constructor(構造器)模式

    這篇文章主要為大家詳細介紹了javascript設計模式Constructor(構造器)模式 ,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 使用plupload自定義參數(shù)實現(xiàn)多文件上傳

    使用plupload自定義參數(shù)實現(xiàn)多文件上傳

    這篇文章主要介紹了使用plupload自定義參數(shù)實現(xiàn)多文件上傳的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • js中如何獲取JSON數(shù)組的長度

    js中如何獲取JSON數(shù)組的長度

    這篇文章主要介紹了js中如何獲取JSON數(shù)組的長度問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • uniapp,微信小程序中使用 MQTT的問題

    uniapp,微信小程序中使用 MQTT的問題

    這篇文章主要介紹了uniapp,微信小程序中使用 MQTT的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 在頁面中引入js的兩種方法(推薦)

    在頁面中引入js的兩種方法(推薦)

    下面小編就為大家?guī)硪黄陧撁嬷幸雑s的兩種方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08

最新評論

灵武市| 商都县| 泸溪县| 南江县| 邮箱| 白城市| 南投县| 喀什市| 蕲春县| 沧州市| 陆河县| 崇文区| 教育| 潢川县| 平泉县| 拜城县| 清流县| 宣恩县| 庆安县| 图木舒克市| 游戏| 宜州市| 陈巴尔虎旗| 贵南县| 南汇区| 三明市| 内丘县| 许昌市| 巨野县| 略阳县| 唐海县| 乳山市| 信阳市| 泌阳县| 汉沽区| 洪雅县| 临高县| 宣汉县| 织金县| 岳阳市| 若尔盖县|