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

【JS】使用MessageChannel实现深度克隆

前言

通常使用简便快捷的JSON 序列化与反序列化实现深克隆,也可以递归实现或者直接使用lodash。

在这里插入图片描述

JSON 序列化与反序列化 无法处理如下的循环引用:

在这里插入图片描述

实现

MessageChannel 内部使用了浏览器内置的结构化克隆算法,该算法可以在不同的浏览器上下文之间传递数据。它能够在传递数据时自动处理对象的深度克隆,包括处理嵌套对象、数组、Map、Set、Date 对象等,同时还可以解决循环引用的问题。

const obj = { a: 1, b: 2 }
obj.c = obj
const { port1, port2 } = new MessageChannel()
port1.postMessage(obj)
port2.onmessage = (msg) => {const obj2 = msg.dataconsole.log(obj2, obj2 === obj)
}

封装为函数

function deepClone(obj) {return new Promise((resolve) => {const { port1, port2 } = new MessageChannel()port1.postMessage(obj)port2.onmessage = (msg) => {resolve(msg.data)}})
}

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

相关文章:

  • 来自OpenAI官网的Function calling介绍与最佳实践
  • 为什么你的RAG不起作用?如何解决语义失调
  • 游戏开发设计模式之桥接模式
  • flutter路由之flutro配置
  • 【Linux篇】三分钟速通Linux基础命令
  • list底层详解
  • 初识C++(8.27)
  • 容器网络-
  • 能大致讲一下Chat GPT的原理吗?
  • ansible的tags标签
  • Kubernetes中的Kube-proxy:服务发现与负载均衡的基石
  • 一张图认识视频中间件
  • Verilog刷题笔记62
  • uniapp使用宫格实现多张图片预览
  • 网络,服务器
  • 在 Spring Boot 中为 MyBatis 添加拦截器
  • 【大数据】深入解析向量数据库Faiss:搭建与使用指南
  • 异步编程下await的理解
  • C++ 解决要编译的工程和依赖工程重名文件夹的问题
  • WHAT - Jamstack(JavaScript, APIs, and Markup 与 Serverless 无服务器架构)