”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 再见`JSON.stringify()`和`{...obj}`,你好`structedClone()`!

再见`JSON.stringify()`和`{...obj}`,你好`structedClone()`!

发布于2024-11-08
浏览:372

Bye-Bye `JSON.stringify()` and `{...obj}`, Hello `structuredClone()`!

  • 什么是 StructuredClone()?

    • StructuredClone() 是 2022 年引入的全局函数,可实现 JavaScript 对象的深度克隆。与 JSON.stringify() 和 JSON.parse() 等传统方法难以应对复杂的结构和循环引用不同,structuredClone() 可以轻松应对这些挑战。
  • 为什么它会改变游戏规则?

    • 它是一个强大的工具,用于创建真正的深度克隆,保留嵌套对象和循环引用的完整性,而不需要额外的逻辑或解决方法。另外,它可以在现代环境中使用,包括 Web Workers。

1.简单对象克隆:基础知识

  • 使用 {...obj}(浅复制)
  const original = { name: "Alice", details: { age: 25 } };
  const shallowCopy = { ...original };

  shallowCopy.details.age = 30;

  console.log(original.details.age); // 30
  console.log(shallowCopy.details.age); // 30
  • 发生了什么事?

    • 扩展运算符 {...obj} 仅创建浅拷贝。详细信息对象没有被深度克隆,因此对shallowCopy.details的更改也会影响原始详细信息。
    • 使用 JSON.stringify() JSON.parse() (深复制)
  const original = { name: "Alice", details: { age: 25 } };
  const deepCopy = JSON.parse(JSON.stringify(original));

  deepCopy.details.age = 30;

  console.log(original.details.age); // 25
  console.log(deepCopy.details.age); // 30
  • 发生了什么事?

    • 此方法创建深层复制,但有局限性:它无法处理函数、未定义或循环引用。
    • 使用 StructuredClone()(深复制)
  const original = { name: "Alice", details: { age: 25 } };
  const clone = structuredClone(original);

  clone.details.age = 30;

  console.log(original.details.age); // 25
  console.log(clone.details.age); // 30
  • 发生了什么事?
    • StructuredClone() 创建深度克隆,保留结构,不受 JSON.stringify() 的任何限制,并处理复杂的数据类型,如循环引用和未定义。

2.处理循环引用:一个挑战

  • 带有 {...obj} 的循环引用
  const original = { name: "Alice" };
  original.self = original;

  // This will cause an error:
  const shallowCopy = { ...original }; // TypeError: Converting circular structure to JSON
  • 发生了什么事?

    • {...obj} 无法处理循环引用,导致错误。
    • 使用 JSON.stringify() 进行循环引用
  const original = { name: "Alice" };
  original.self = original;

  // This will cause an error:
  const jsonCopy = JSON.parse(JSON.stringify(original)); // TypeError: Converting circular structure to JSON
  • 发生了什么事?

    • JSON.stringify() 也会因循环引用而失败,引发错误。
    • 使用 StructuredClone() 进行循环引用
  const original = { name: "Alice" };
  original.self = original;

  const clone = structuredClone(original);

  console.log(clone !== original); // true
  console.log(clone.self === clone); // true
  • 发生了什么事?
    • StructuredClone() 无缝处理循环引用,创建正确的深度克隆而不会出现错误。

3.使用函数和未定义进行克隆:另一个测试

  • 使用 {...obj}
  const original = { name: "Alice", greet: () => "Hello!", value: undefined };
  const shallowCopy = { ...original };

  console.log(shallowCopy.greet()); // "Hello!"
  console.log(shallowCopy.value); // undefined
  • 发生了什么事?

    • {...obj} 复制函数并按预期未定义,但只是浅层。
    • 使用 JSON.stringify()
  const original = { name: "Alice", greet: () => "Hello!", value: undefined };
  const jsonCopy = JSON.parse(JSON.stringify(original));

  console.log(jsonCopy.greet); // undefined
  console.log(jsonCopy.value); // undefined
  • 发生了什么事?

    • JSON.stringify() 无法序列化函数或未定义,导致它们在克隆对象中丢失。
    • 使用 StructuredClone()
  const original = { name: "Alice", greet: () => "Hello!", value: undefined };
  const clone = structuredClone(original);

  console.log(clone.greet); // undefined
  console.log(clone.value); // undefined
  • 发生了什么事?
    • StructuredClone() 也不会克隆函数,但会保留未定义的值,这使得它对于复杂对象比 JSON.stringify() 更可靠。

4.速度和效率:性能说明

  • 大数据的效率
  const largeArray = new Array(1e6).fill({ key: "value" });

  console.time("structuredClone");
  const clone = structuredClone(largeArray);
  console.timeEnd("structuredClone");

  console.time("JSON.stringify   JSON.parse");
  const jsonCopy = JSON.parse(JSON.stringify(largeArray));
  console.timeEnd("JSON.stringify   JSON.parse");
  • 发生了什么事?
    • 对于大型、复杂的数据, StructuredClone() 通常比 JSON.stringify() JSON.parse() 更快,并且避免了序列化和反序列化的陷阱。

5.结论:为什么 StructuredClone() 是未来

  • 可靠性:更可预测地处理循环引用、函数和未定义值。
  • 效率:对大型数据集更快地执行深度克隆,并且不需要解决方法。
  • 简单性:一种统治所有这些的方法 - 不再需要在 {...obj}、JSON.stringify() 或自定义深度克隆函数之间进行选择。
版本声明 本文转载于:https://dev.to/dharamgfx/bye-bye-jsonstringify-and-obj-hello-structuredclone-2e4c?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 不可变数据结构:ECMA 4 中的记录和元组
    不可变数据结构:ECMA 4 中的记录和元组
    不可变数据结构:ECMAScript 2024 中的新功能 ECMAScript 2024 引入了几个令人兴奋的更新,但对我来说最突出的一个功能是引入了不可变数据结构。这些新结构——记录和元组——改变了 JavaScript 中数据管理的游戏规则。它们提供了一种令人满意的方式来保持...
    编程 发布于2024-11-08
  • 如何在 PHP 中为注册用户自定义 URL?
    如何在 PHP 中为注册用户自定义 URL?
    在 PHP 中为注册用户设置自定义 URL对于电子商务平台来说,为每个用户提供唯一的 URL 对于展示他们的产品至关重要单独的产品。通过生成单独的网址(例如 www.seloncart.com/customername),您可以显示客户的特定产品。为此,请按照下列步骤操作:配置服务器路由: 修改服务...
    编程 发布于2024-11-08
  • 我如何用 Python 创建 QR 码生成器
    我如何用 Python 创建 QR 码生成器
    这将是一篇简短的文章,介绍我如何在 Python 中创建一个简单的二维码生成器 对于此步骤,您需要使用 qrcode 库:https://pypi.org/project/qrcode/ 创建项目文件夹后我所做的第一步就是创建一个虚拟环境。 Python 中的虚拟环境只是计算机上另一个独立的工作区,...
    编程 发布于2024-11-08
  • 如何在 PHP 中验证整数数据类型?
    如何在 PHP 中验证整数数据类型?
    验证 PHP 中的整数数据类型在 PHP 中处理数字数据时,确定变量是否表示整数至关重要。为了解决这个问题,通常使用 is_int() 函数。然而,它的行为有时可能是意想不到的,导致混乱。为了纠正这个问题,我们引入了验证整数数据类型的替代方法:FILTER_VALIDATE_INT使用该方法,可以高...
    编程 发布于2024-11-08
  • 为什么 DOMSubtreeModified 在 DOM Level 3 中被弃用以及替代方案是什么?
    为什么 DOMSubtreeModified 在 DOM Level 3 中被弃用以及替代方案是什么?
    在 DOM Level 3 中弃用 DOMSubtreeModified 事件DOMSubtreeModified 事件曾经是跟踪文档子树中更改的基本元素,现在已被在 DOM level 3 中已过时。了解这种弃用背后的基本原理并确定合适的替代方案至关重要。DOM Level 3 规范对 DOMSu...
    编程 发布于2024-11-08
  • 将 PDO 连接设置为 NULL 是否真正关闭连接并释放资源?
    将 PDO 连接设置为 NULL 是否真正关闭连接并释放资源?
    关闭PDO连接在PHP中,有两种流行的数据库连接接口:MySQLi和PDO。虽然两者的用途相似,但它们处理连接关闭的方式不同。MySQLi 需要显式关闭函数调用来释放连接:$this->connection->close();相反,PDO 使用空赋值来终止连接:$this->con...
    编程 发布于2024-11-08
  • 动态数据管理:了解 Vue.js 中的数据属性
    动态数据管理:了解 Vue.js 中的数据属性
    Vue.js 是用于开发现代 Web 应用程序的最流行的 JavaScript 框架之一。它提供了一种创建交互式动态应用程序的有效方法。在本文中,我们将深入研究 Vue.js 中的 data 属性,并探讨它的工作原理、为什么要使用它以及围绕它的最佳实践。 什么是数据属性? 在Vue....
    编程 发布于2024-11-08
  • 如何有效地检查 Python 字符串中是否存在列表元素?
    如何有效地检查 Python 字符串中是否存在列表元素?
    检查 Python 中字符串中列表元素的存在Python 编程中的一个常见任务是验证字符串是否包含给定的元素列表。传统方法采用 for 循环,如下面的代码所示:extensionsToCheck = ['.pdf', '.doc', '.xls'] for extension in extensio...
    编程 发布于2024-11-08
  • \'window.JSON\' 如何在现代浏览器中提供本机 JSON 支持?
    \'window.JSON\' 如何在现代浏览器中提供本机 JSON 支持?
    浏览器原生 JSON 支持:window.JSON 对象window.JSON 对象为现代 Web 浏览器提供原生 JSON 解析和序列化功能,实现结构化数据的高效、安全处理。本文探讨了该对象的详细信息,包括其支持的方法和浏览器兼容性。window.JSON 公开的方法window.JSON 对象公...
    编程 发布于2024-11-08
  • Java 中的接口继承自对象类吗?
    Java 中的接口继承自对象类吗?
    接口和对象类:继承和方法调用在 Java 中,接口提供了一种定义类可以实现的契约的方法。在考虑接口和Object类的关系时,就提出了继承的问题。接口是否继承自Object类?答案是否。接口不继承自Object 类。与类不同,所有接口都不会隐式继承任何公共根接口。接口实例上的方法调用尽管不是从 Obj...
    编程 发布于2024-11-08
  • Python:有趣的代码模式
    Python:有趣的代码模式
    我主要使用 Python 工作,几乎每天都会检查代码。在我们的代码库中,格式化和 linting 由 CI 作业使用 black 和 mypy 处理。因此,我们只关注变化。 在团队中工作时,您已经知道某个团队成员会编写什么样的代码。当新人加入团队时,代码审查会变得有趣。我说有趣,是因为每个人都有一些...
    编程 发布于2024-11-08
  • 在 Laravel 中使用 Redis 进行缓存:分步指南
    在 Laravel 中使用 Redis 进行缓存:分步指南
    Introduction Laravel is, without fear of contradiction, the most popular PHP framework, and among the most popular within web development. Re...
    编程 发布于2024-11-08
  • 释放实时 UI 的力量:使用 React.js、gRPC、Envoy 和 Golang 流式传输数据的初学者指南
    释放实时 UI 的力量:使用 React.js、gRPC、Envoy 和 Golang 流式传输数据的初学者指南
    作者:Naveen M 背景 作为 Kubernetes 平台团队的一部分,我们面临着提供用户工作负载实时可见性的持续挑战。从监控资源使用情况到跟踪 Kubernetes 集群活动和应用程序状态,每个特定类别都有许多开源解决方案。然而,这些工具往往分散在不同的平台上,导致用户体验支离...
    编程 发布于2024-11-08
  • 构建您自己的操作系统(真的!):初学者 C 编程
    构建您自己的操作系统(真的!):初学者 C 编程
    建立自己的操作系统:安装 C 编译器和工具,如 MinGW-w64。使用汇编语言编写引导加载程序,加载内核。用 C 语言创建内核,包括命令解释器。使用 Makefile 将引导加载程序和内核组合为“os.img”文件。在 VirtualBox 等虚拟机或硬件上运行“os.img”文件。创建自己的操作...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3