当前位置: 首页 > news >正文

JavaScript 中的深拷贝新宠:structuredClone() 函数详解

在 JavaScript 中,处理对象拷贝时,我们经常会遇到浅拷贝(shallow copy)和深拷贝(deep copy)的概念。浅拷贝只复制对象的第一层属性,如果属性值是引用类型(如对象、数组等),则只复制引用而不复制对象本身,这可能会导致原始数据被意外修改。而深拷贝则递归地复制对象及其所有子属性,确保原始数据和拷贝数据完全独立。

传统上,JavaScript 没有内置直接进行深拷贝的函数,开发者通常需要自己编写深拷贝函数或使用第三方库(如 lodash 的 _.cloneDeep())。然而,随着现代浏览器的发展,一个新的全局函数 structuredClone() 被引入,它提供了一种方便且高效的方式来执行深拷贝。

structuredClone() 函数的基本用法

structuredClone() 函数可以创建一个给定值的深拷贝。它不仅可以处理普通对象和数组,还能处理更多复杂的数据类型,如 Map、Set、Blob、File、ImageData、ArrayBuffer、TypedArrays、RegExp 对象以及日期和错误对象等。

语法

javascript

let clone = structuredClone(valueToClone, [transfer]);
  • valueToClone:要拷贝的值。
  • [transfer](可选):一个包含可转移(transferable)对象的数组,这些对象将被转移而不是被拷贝。这主要用于处理如
    ArrayBuffer 和 MessagePort 这样的对象,这些对象在原始上下文中不应再被使用。

示例

// 示例对象,包含嵌套对象和数组  
const original = {  a: 1,  b: { c: 2, d: [3, 4] },  c: new Date()  
};  // 使用 structuredClone 进行深拷贝  
const clone = structuredClone(original);  // 修改克隆对象的属性  
clone.b.c = 10;  
clone.b.d.push(5);  // 检查原始对象是否受影响  
console.log(original.b.c); // 输出: 2  
console.log(original.b.d); // 输出: [3, 4]  // 原始对象和克隆对象保持独立  
console.log(clone.b.c); // 输出: 10  
console.log(clone.b.d); // 输出: [3, 4, 5]

structuredClone() 与其他深拷贝方法的比较

  • 自定义深拷贝函数:需要手动编写,对于复杂对象可能难以完美处理所有情况。

  • lodash 的_.cloneDeep():功能强大,但引入了额外的库依赖。

  • JSON.parse(JSON.stringify()):简单快捷,但无法处理函数、undefined、symbol、循环引用等。

    相比之下,structuredClone()提供了更广泛的支持,包括循环引用和特殊类型的对象,同时避免了额外的库依赖。然而,值得注意的是,由于 structuredClone()是相对较新的 API,其浏览器兼容性可能不如其他方法广泛。

浏览器兼容性

虽然 structuredClone() 在现代浏览器中得到了良好的支持(如 Chrome、Firefox、Edge 等),但在一些老旧浏览器或特定环境中可能无法使用。因此,在实际项目中使用时,请务必考虑目标环境的兼容性。

结论

structuredClone() 函数为 JavaScript 开发者提供了一种强大且灵活的深拷贝解决方案,适用于处理各种复杂数据类型。随着现代浏览器的普及,我们可以期待这一函数在未来的项目中发挥更大的作用。然而,在采用新技术时,我们也应关注其兼容性,确保应用的稳定运行。

参考:structuredClone()介绍

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 网络安全之xss靶场练习
  • 用py获取显卡的占用率
  • 【解压即玩】PC电脑版【漫威蜘蛛侠2】豪华中文版+通关存档+画质超棒,神作
  • MySQL——单表查询(二)按条件查询(11)OR 和 AND 关键字一起使用的情况
  • Springcloud从零开始--Eureka(一)
  • 九、 系统安全(考点篇)试题
  • 无人机飞手培训:考证、组装、维修技术详解
  • 深信服技术服务工程师面试全过程分享
  • 为什么Qt源码中要用d_ptr和q_ptr
  • 力扣223题详解:矩形面积的多种解法与模拟面试
  • 两个dp题
  • MyBatis 源码解读:专栏导读与学习路线
  • python模块 - os系统交互模块
  • 订单到期关闭如何实现?
  • 中移动集团SRE人员能力提升培训圆满结课
  • canvas绘制圆角头像
  • JavaScript DOM 10 - 滚动
  • JavaScript 基本功--面试宝典
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • SegmentFault 2015 Top Rank
  • vue-cli3搭建项目
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 代理模式
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 你不可错过的前端面试题(一)
  • 前端相关框架总和
  • 入口文件开始,分析Vue源码实现
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 我感觉这是史上最牛的防sql注入方法类
  • 写代码的正确姿势
  • 鱼骨图 - 如何绘制?
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # .NET Framework中使用命名管道进行进程间通信
  • ${factoryList }后面有空格不影响
  • (附源码)ssm码农论坛 毕业设计 231126
  • (接口封装)
  • (六)激光线扫描-三维重建
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (学习总结16)C++模版2
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)可以带来幸福的一本书
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .net mvc 获取url中controller和action
  • .net SqlSugarHelper
  • .NET 快速重构概要1
  • .net 生成二级域名
  • .net2005怎么读string形的xml,不是xml文件。