当前位置: 首页 > 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()介绍


http://www.mrgr.cn/news/4641.html

相关文章:

  • 单片机烧录
  • 开发高质量PDF应用的不二选择:PdfiumViewer库详细解析
  • C语言手撕实战代码_循环单链表和循环双链表
  • 【15】Java字节码
  • 硬件工程师必须掌握的MOS管详细知识
  • 牛客网SQL进阶134: 满足条件的用户的试卷总完成次数和题目总练习次数
  • Linux系统编程——网络通信
  • Git存储库添加空目录-添加占位文件
  • Spring 中AutowireCapableBeanFactory
  • 【区块链+商贸零售】预付宝:商家数字经济服务平台 | FISCO BCOS应用案例
  • Windows C++控制台菜单库开发与源码展示
  • 【Linux系列】telnet使用入门
  • 微信小程序如何存储值
  • javaEE——过滤器
  • 解决STM32使用J-Link可以擦除和读取但是无法烧录问题
  • mac m1 Too many open files in system
  • 基于Java爬取微博数据(四) 获取 图片 or 视频
  • 黑神话:悟空-配置推荐
  • WUP-MY-LABEL-PRINTER 旻佑热敏打印机标签打印uniapp插件使用说明
  • 响应式Web设计(Responsive Web Design, RWD)