如果使用JSON.stringify进行深拷贝有什么弊端?如何解决?

news/2024/12/14 9:33:41/文章来源:https://www.cnblogs.com/ai888/p/18606364

使用 JSON.stringify() 进行深拷贝在前端开发中有一些显著的弊端:

  1. 只能复制可序列化的数据: JSON.stringify() 只能复制那些可以被 JSON 表示的数据类型。这意味着以下几种类型的数据无法被正确复制:

    • 函数: 函数会被转换成字符串 "function () { ... }",丢失其可执行性。
    • 正则表达式: 正则表达式也会被转换成字符串,同样丢失其功能。
    • Date 对象: Date 对象会被转换成其 ISO 字符串表示,拷贝后不再是 Date 对象。
    • undefined, Symbol, Map, Set, BigInt: 这些类型的数据无法被 JSON 序列化。
    • 包含循环引用的对象: 如果对象之间存在循环引用(例如,对象 A 的属性指向对象 B,而对象 B 的属性又指向对象 A),JSON.stringify() 会抛出错误。
  2. 性能问题: 对于大型复杂的对象,JSON.stringify()JSON.parse() 的性能开销可能比较大,特别是对于嵌套较深的对象。

  3. 数据类型丢失: 即使是可序列化的数据,在序列化和反序列化的过程中也可能发生数据类型的丢失或改变。例如,数字可能会被转换成字符串。

如何解决?

为了克服 JSON.stringify() 的这些缺点,可以使用以下方法进行深拷贝:

  • structuredClone() (推荐): 这是现代浏览器支持的一种更强大的深拷贝方法,可以处理更多的数据类型,包括函数、正则表达式和 Map、Set 等。它也能够处理循环引用,但会产生一个警告而不是错误。 需要注意的是,它仍然无法复制不可克隆的对象,例如 DOM 节点。

    const deepCopy = structuredClone(originalObject);
    
  • 循环遍历和递归: 对于简单的对象,可以手动编写递归函数来遍历对象并创建其副本。这需要仔细处理各种数据类型,并避免循环引用。 这方法比较繁琐,不推荐用于复杂的场景。

  • Lodash 的 cloneDeep(): Lodash 是一个流行的 JavaScript 工具库,其中包含 cloneDeep() 方法,可以进行可靠的深拷贝。它处理各种数据类型,包括函数和正则表达式,并且能处理循环引用。 但是需要引入 Lodash 库,增加项目体积。

    const _ = require('lodash'); // 需要安装 lodash: npm install lodash
    const deepCopy = _.cloneDeep(originalObject);
    
  • 其他库: 除了 Lodash,还有其他一些库提供深拷贝功能,例如 clone-deep 等。

总结:

JSON.stringify() 只能用于复制简单的、可序列化的 JSON 数据。对于更复杂的对象,structuredClone() 是首选,因为它性能好且功能强大。如果需要处理非常复杂的数据结构或者需要兼容旧浏览器,则可以使用 Lodash 的 cloneDeep() 方法。 选择哪种方法取决于你的项目需求和复杂性。 记住要根据你的实际情况选择最合适的方案,权衡性能和代码复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/852421.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS NEXT开发实战教程—淘宝搜索页

今天忙里偷闲,分享一个淘宝搜索页实现过程,先上效果图:界面部分比较简单,大体分为导航栏、历史搜索、猜你想搜和热搜榜几个部分,历史搜索采用用户首选项进行存储数据。 导航栏部分相关代码如下:Flex({direction:FlexDirection.Row,wrap:FlexWrap.NoWrap,alignItems:ItemA…

易优EyouCMS的“易优修改重置后台密码小工具”有哪些功能,如何使用?

易优EyouCMS的“易优修改重置后台密码小工具”是一个非常实用的工具,可以帮助您在忘记后台密码或其他登录问题时快速解决问题。以下是该工具的主要功能及其使用方法:后台密码重置:功能介绍:如果您忘记了后台管理员密码,可以使用此工具快速重置。 使用方法:下载 setpwd.ph…

如何在易优EyouCMS中手动创建缺失的数据表?

在使用易优EyouCMS时,如果遇到数据表缺失的情况,您可以通过以下步骤手动创建缺失的数据表:确认数据表缺失:登录到您的数据库管理工具(如phpMyAdmin),检查报错中提到的数据表是否存在于当前数据库中。例如,如果报错提示“数据表 ey_product_spec_value_handle 不存在”,…

WSL搭建深度强化学习环境

WSL搭建深度强化学习环境 https://zhuanlan.zhihu.com/p/683058297 假定你已经安装好wsl 安装miniconda https://docs.anaconda.com/miniconda/install/ curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash ~/Miniconda3-latest-Linux-x86_6…

【Word文档】结构分析+安全

结构分析 自2000年代中期以来,办公文档(如2005年发布的 OpenOffice.org 2.0)已经被设计为一种包含文档内容的归档文件。在下图中,可以看到一个 Word 文档的结构。从上图可以发现,这个归档文件中的所有结构是相互关联的,而这种关系是从末端开始的。 在归档文件的末尾,有一…

【Word文档】结构分析

自2000年代中期以来,办公文档(如2005年发布的 OpenOffice.org 2.0)已经被设计为一种包含文档内容的归档文件。在下图中,可以看到一个 Word 文档的结构。从上图可以发现,这个归档文件中的所有结构是相互关联的,而这种关系是从末端开始的。 在归档文件的末尾,有一个名为中…

财务知识-开票加税点的合理点数

财务知识-开票加税点的合理点数

【大数据】大数据 Hadoop 管理工具 Apache Ambari(HDP)

一、概述 Apache Ambari 是 Hortonworks 贡献给Apache开源社区的顶级项目,它是一个基于web的工具,用于安装、配置、管理和监视 Hadoop 集群。 Ambari 目前已支持大多数 Hadoop 组件,包括 HDFS、MapReduce、Hive、Pig、 Hbase、Zookeper、Sqoop 和 Hcatalog 等。 Apache Amba…

读数据保护:工作负载的可恢复性13一致性模型

一致性模型1. 一致性模型 1.1. 数据库与其他东西相比,还有一个很重要的区别就在于,它们需要通过某种机制来确保数据一致,对于运行在多个节点上的数据库来说,这尤其重要1.1.1. 一致性模型(consistency model)1.2. 立即一致性1.2.1. 立即一致性(immediate consistency)也叫强…

【Hadoop框架】 生态组件之分布式文件系统 HDFS 常用命令

一、HDFS集群的启动停止1.1 单服务启动停止方式1.1.1 单服务启动1.1.2 单服务停止1.2 多服务启动停止方式1.2.1 多服务启动1.2.2 多服务停止二、获取HDFS集群信息三、HDFS常用命令3.1 查看HDFS帮助命令3.1.1 查看hdfs命令使用提示3.1.2 查看特定指定的使用方法3.2 在HDFS上创建…

渗透测试-前端验签绕过之SHA256

本文是高级前端加解密与验签实战的第1篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过SHA256签名来爆破登录。 绕过通过查看源代码可以看到key为 1234123412341234通过查看源代码可以看到是通过SHA256来进行签名的,他把请求体的username和password字…

如何跨越心理距离,构建客户信任桥梁

销售活动本质上是销售人员与相对陌生或不够熟悉的对象建立联系的过程。在此过程中,销售人员面对的客户可能是完全陌生的,或是虽有数次交集却彼此了解不深。这种情形自然导致了双方心理上的显著距离,进而引发客户的疑虑与不信任,对可能遭遇的欺骗保持警惕,实属人之常情。 因…