javascript中的structuredClone()克隆方法

 更新时间:2025年07月14日 11:39:23   作者:Mr.怪兽  
本文介绍了JavaScript的structuredClone方法,用于在WebWorkers中创建对象的深度副本,避免并发问题,具有一定的参考价值,感兴趣的可以了解一下

前言:

structuredClone 是 JavaScript 的方法之一,用于深拷贝一个对象。它的语法是 structuredClone(obj),其中 obj 是要拷贝的对象。structuredClone 方法将会创建一个与原始对象完全相同但是独立的副本。

案例:

当使用Web Workers进行多线程编程时,structuredClone 方法可以用于将数据从主线程传递到工作线程,并在工作线程中创建一个完全独立的副本。以下是一个使用 structuredClone 方法的示例:

// 在主线程中
const myObject = {
  name: 'John',
  age: 30
};

const worker = new Worker('worker.js');
worker.postMessage({ data: structuredClone(myObject) });

// 在工作线程中的 worker.js 文件中
self.addEventListener('message', (event) => {
  const clonedObject = structuredClone(event.data.data);
  // 在工作线程中使用被复制的对象
})

在主线程中,我们创建一个包含名称和年龄属性的 myObject 对象。然后,通过 postMessage 方法将 myObject 对象传递给工作线程。在工作线程中,我们使用 addEventListener 监听 message 事件,当接收到消息时,使用 structuredClone 方法创建一个 clonedObject 对象来对被传递的对象进行深拷贝。

通过使用 structuredClone 方法,我们确保在工作线程中获得的 clonedObject 对象与在主线程中的 myObject 对象完全独立,以避免并发访问和意外修改问题。

优点:

  1. 完全复制对象:structuredClone 方法能够创建一个原始对象的完全副本,包括对象的原型链、方法等所有属性和方法。
  2. 简便易用:使用 structuredClone 方法非常简单,只需将需要拷贝的对象作为参数传入即可。

缺点:

  1. 只适用于特定环境:structuredClone 方法目前只在 Web Worker 中以及在某些特定环境下受支持,如 Chrome、Firefox 等。不是所有浏览器和 JavaScript 运行时都支持该方法。
  2. 不支持拷贝函数、正则表达式等:structuredClone 方法无法复制函数、正则表达式等特殊类型的对象。只有具有结构化数据的对象才能被成功复制。
  3. 不支持循环引用:structuredClone 方法无法处理包含循环引用的对象,否则会抛出异常。因此,在拷贝对象时需要注意确保没有循环引用的存在。

对比_.cloneDeep() 和 Json.parse(JSON.stringify()):

为什么不使用Json.parse(JSON.stringify())?

原因:因为Json.parse(JSON.stringify())能做到的structuredClone 也能做到,最关键的是当使用Json.parse(JSON.stringify())克隆Date 时间后的数据格式会变化,而不是原来的数据。
 

const calendarEvent = {
  title: "Builder.io Conf",
  date: new Date(123),
  attendees: ["Steve"]
}

// 🚩 JSON.stringify 获取到的date数据是字符串格式
const problematicCopy = JSON.parse(JSON.stringify(calendarEvent))

打印出来的结果如下:

{
  title: "Builder.io Conf",
  date: "1970-01-01T00:00:00.123Z"
  attendees: ["Steve"]
}

如果使用structuredClone 就不会出现该问题。

为什么不使用_.cloneDeep() ?

如果只是想用这一个克隆的方法而引用lodash和cloneDeep那么就占用太多资源了。

到此这篇关于javascript中的structuredClone()克隆方法的文章就介绍到这了,更多相关javascript structuredClone()克隆内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解JS面向对象编程

    详解JS面向对象编程

    这篇文章主要为大家介绍了js面向对象编程,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • 微信小程序中吸底按钮适配iPhone X方案

    微信小程序中吸底按钮适配iPhone X方案

    这篇文章主要介绍了微信小程序中吸底按钮适配iPhone X方案,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11
  • JavaScript实现省市区三级联动

    JavaScript实现省市区三级联动

    这篇文章主要为大家详细介绍了JavaScript实现省市区三级联动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • JS回调函数简单易懂的入门实例分析

    JS回调函数简单易懂的入门实例分析

    这篇文章主要介绍了JS回调函数,结合简单实例形式分析了javascript回调函数的概念、原理、相关操作技巧与使用注意事项,需要的朋友可以参考下
    2019-09-09
  • 获取客户端网卡MAC地址和IP地址实现JS代码

    获取客户端网卡MAC地址和IP地址实现JS代码

    获取客户端的一些信息,如IP和MAC,以结合身份验证,相信很多人都会这样做吧,我们这里用Javascript,这样做的好处是不需要服务器端进行处理,有客户端自行获取,感兴趣的你可以参考下哈
    2013-03-03
  • JavaScript简单实现鼠标拖动选择功能

    JavaScript简单实现鼠标拖动选择功能

    本篇文章主要是对JavaScript简单实现鼠标拖动选择功能的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-03-03
  • JavaScript通过Date-Mask将日期转换成字符串的方法

    JavaScript通过Date-Mask将日期转换成字符串的方法

    这篇文章主要介绍了JavaScript通过Date-Mask将日期转换成字符串的方法,涉及javascript日期、数组及字符串操作的相关技巧,需要的朋友可以参考下
    2015-06-06
  • json数据处理及数据绑定

    json数据处理及数据绑定

    本文主要介绍了json数据处理及数据绑定的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • Lab.js初次使用笔记

    Lab.js初次使用笔记

    这篇文章主要介绍了Lab.js初次使用笔记,本文对比了普通动态加载JS文件的技术和使用Lab.js加载JS文件的技术,并给出了Lab.js加载示例,需要的朋友可以参考下
    2015-02-02
  • js利用事件的阻止冒泡实现点击空白模态框的隐藏

    js利用事件的阻止冒泡实现点击空白模态框的隐藏

    点击弹出某个框框,但是,有时候不想操作,就想点击某个空白处,隐藏该框框,关于这一点,下面有个具体的实现
    2014-01-01

最新评论