JavaScript深拷贝方法structuredClone使用

JavaScript中的拷贝(复制)有两种:浅拷贝和深拷贝。

浅拷贝只复制基本数据类型的值,而对于引用数据类型(如对象,数组等),只复制了其引用地址,因此它们指向同一个对象,当一个对象的值改变,另一个对象的值也会跟着改变。

而深拷贝则会复制出一个全新的对象,与被复制的对象互不影响。

这里介绍一种深拷贝方法,即使用“structuredClone”。

1. structuredClone概念

structuredClone是HTML5中的API,它可以对现有对象进行深拷贝,生成一个新的、与原对象内容完全相等的对象。structuredClone支持绝大多数JS对象,包括Array,Date,RegExp,Blob,FileList等等,但不支持Function,Error和DOM节点等引用类型。

2. structuredClone使用说明

2.1 示例1

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

let obj = {
  a: 1,
  b: {
    c: 2,
    d: {
      e: 3,
      f: [4,5,6]
    }
  }
};

deepClone(obj).then(res => {
  console.log(res); // 深拷贝后的新对象
});

上述代码中,我们定义了一个deepClone方法,接收一个对象obj作为参数。在deepClone方法中,我们创建了一个新的MessageChannel,该消息通道有两个端口,用于通信。在拷贝对象时,我们向port2发送了obj对象,接着在port1端口里监听onmessage事件,在事件回调中用resolve方法返回拷贝后的新对象。

2.2 示例2

function deepClone(obj) {
  return JSON.parse(JSON.stringify(obj));
}

let obj = {
  a: 1,
  b: {
    c: 2,
    d: {
      e: 3,
      f: [4,5,6]
    }
  }
};

let newObj = deepClone(obj);

console.log(newObj); // 深拷贝后的新对象

上述代码中,我们定义了一个deepClone方法,利用 JSON.parse(JSON.stringify(obj))这段代码实现对象的深拷贝。

首先,JSON.stringify()能将一个JavaScript对象转化为JSON字符串,而JSON字符串是不包含任何JavaScript对象的方法或数据的,也就是说,JSON.stringify方法过滤掉了参数对象中的不可枚举属性,包括对象原型中的不可枚举属性,同时不能正确处理Date、RegExp、Error等引用类型数据,和 undefined,NaN,Infinity等特殊值。因此,此方法并不是一种万能的深拷贝方法。

随后,利用JSON.parse()方法能够将JSON字符串转化为JavaScript对象,这时我们便可得到一个新的深拷贝后的对象。但这种方法的问题是,它不能保留对象原型上的数据和函数,并且当对象中存在循环引用的情况时,会抛出异常。

3. 总结

从上述内容中可以看出,使用structuredClone()或JSON.parse(JSON.stringify(obj))方法实现对象的深拷贝各有优劣,因此在实际使用过程中,我们需要根据对象的特点来选择适合的方法。同时,在开发中,为了保证代码的健壮性和效率,我们应该针对不同类型对象的情况,使用不同的深拷贝方案。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript深拷贝方法structuredClone使用 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 详解Node.js项目APM监控之New Relic

    详解Node.js项目APM监控之New Relic 什么是APM? APM(Application Performance Management)指的是应用程序性能管理。它是一种监控和管理应用程序性能的技术。APM有助于在开发和生产环境中管理、诊断和优化应用程序的性能,以提高用户的体验。 什么是New Relic? New Relic是一种高度智能的APM…

    node js 2023年6月8日
    00
  • 谈谈node.js中的模块系统

    让我来为您详细讲解一下“谈谈node.js中的模块系统”。 什么是模块 在 Node.js 中,模块是指实现某一具体功能的 JavaScript 代码单元。在集成到 Node.js 应用程序中之前,这些代码单元都是独立编写、测试和调试的。通过使用 require() 方法,可以将这些代码单元加载到应用程序中使用,这就是 Node.js 的模块系统。 使用模块…

    node js 2023年6月8日
    00
  • Node.js开源应用框架HapiJS介绍

    当谈论Node.js开源应用框架的时候,HapiJS必然是其中一员。HapiJS是一个可扩展、自我胜任的Web应用框架,它专注于开发可重复使用、渐进式的Node.js应用程序。 HapiJS的特点和优势 HapiJS有许多特点和优势,其中最突出的包括: 纯JavaScript:HapiJS完全由JavaScript编写,因此非常容易学习和使用。 插件系统:H…

    node js 2023年6月8日
    00
  • NodeJS 文件夹拷贝以及删除功能

    下面是详细的NodeJS文件夹拷贝以及删除功能攻略。 文件夹拷贝 我们可以使用NodeJS中的fs模块来实现文件夹的拷贝功能。具体的实现步骤如下: 使用fs.readdir()方法来获取要拷贝的文件夹中的所有文件和子文件夹。该方法返回一个字符串数组,数组中包含了文件夹中的所有子文件夹、文件的名字; const fs = require(‘fs’); fs.r…

    node js 2023年6月8日
    00
  • 详解react应用中的DOM DIFF算法

    详解 React 应用中的 DOM DIFF 算法 在 React 中,每一个组件的 UI 表现都是通过 JavaScript 对象来描述的,这些 JavaScript 对象就是 Virtual DOM。在 React 应用中,当 Virtual DOM 发生变化时,React 会利用 DOM DIFF 算法来计算出应该对哪些实际的 DOM 元素进行操作,从…

    node js 2023年6月8日
    00
  • Node定时备份MySQL的实现

    下面是详细讲解“Node定时备份MySQL的实现”的完整攻略: 1. 操作系统环境 首先,Node定时备份MySQL需要在一个支持Node.js的操作系统环境下运行,例如Windows、macOS或Linux等。 2. 安装Node.js和npm 接下来,需要在操作系统中安装Node.js和npm。可以从Node.js官网下载安装程序并根据提示进行安装。 3…

    node js 2023年6月8日
    00
  • Nodejs抓取html页面内容(推荐)

    Node.js 是一个用于编写高效且可扩展的网络应用程序的跨平台 JavaScript 运行时环境。它使用事件驱动、非阻塞 I/O 模型,使其轻松处理大量并发连接。在Node.js中,抓取HTML页面内容可以使用request和Cheerio两个库来实现。 安装依赖库 在使用Node.js抓取HTML页面内容之前,需要先安装所需的依赖库,即request和C…

    node js 2023年6月8日
    00
  • Node.js中如何合并两个复杂对象详解

    合并两个复杂对象在Node.js中是一种常见需求。下面是合并两个复杂对象的完整攻略: 步骤一:安装lodash模块 在Node.js中,可以使用lodash模块来合并两个复杂对象。因此,在进行对象合并之前,需要保证该模块已安装。 npm install –save lodash 步骤二:导入lodash模块 在对象合并之前,需要将lodash模块导入到No…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部