JS 数组和对象的深拷贝操作示例

yizhihongxing

让我来详细讲解一下 “JS 数组和对象的深拷贝操作示例”的完整攻略。

什么是深拷贝?

在 JavaScript 中,对象和数组是非常常用的数据类型,而涉及到对象和数组的拷贝时,我们通常有两种方式,分别是浅拷贝和深拷贝。

浅拷贝指的是将原对象的引用赋值给目标对象,即两个对象指向同一个内存地址,所以修改一个对象会影响到另一个对象。而深拷贝则是将原对象完全复制一份,生成一个新的对象,在内存中分别占用不同的地址。深拷贝目标对象与原对象完全独立,修改目标对象不会对原对象造成任何影响。

如何进行深拷贝操作?

方法一:使用 JSON.parse 和 JSON.stringify 进行深拷贝

这是一种常见的深拷贝方式,首先通过 JSON.stringify() 将原对象转成 JSON 格式的字符串,再通过 JSON.parse() 将这个字符串转成新的对象,从而完成深拷贝。

以下是一个示例代码:

const sourceObj = { a: 1, b: 2, c: [3, 4, 5] };
const targetObj = JSON.parse(JSON.stringify(sourceObj));

// 修改 targetObj,不会影响到 sourceObj
targetObj.c.push(6);
console.log(sourceObj); // { a: 1, b: 2, c: [3, 4, 5] }
console.log(targetObj); // { a: 1, b: 2, c: [3, 4, 5, 6] }

需要注意的是,该方法存在一些局限性:

  • 如果原对象中有函数或者 Symbol 类型的属性,无法通过这种方式进行拷贝
  • 如果原对象中存在循环引用的情况,也无法通过这种方式进行拷贝

方法二:使用递归进行深拷贝

递归是一种常见的深拷贝方式,思路是遍历原对象的属性并将其复制到新的对象中,同时判断该属性是否为对象或数组,如果是则继续递归处理。

以下是一个示例代码:

function deepCopy(sourceObj) {
  // 判断 sourceObj 是否为对象或数组
  if (typeof sourceObj !== 'object' || sourceObj === null) {
    return sourceObj;
  }

  const targetObj = Array.isArray(sourceObj) ? [] : {};

  // 遍历 sourceObj 的属性并递归进行深拷贝
  for (const key in sourceObj) {
    targetObj[key] = deepCopy(sourceObj[key]);
  }

  return targetObj;
}

const sourceObj = { a: 1, b: { c: 2 }, d: [3, 4, 5] };
const targetObj = deepCopy(sourceObj);

// 修改 targetObj,不会影响到 sourceObj
targetObj.d.push(6);
console.log(sourceObj); // { a: 1, b: { c: 2 }, d: [3, 4, 5] }
console.log(targetObj); // { a: 1, b: { c: 2 }, d: [3, 4, 5, 6] }

需要注意的是,该方法也存在一些局限性:

  • 如果原对象中有函数或者 Symbol 类型的属性,需要特殊处理
  • 如果原对象中存在循环引用的情况,需要特殊处理

总结

本文主要介绍了如何进行 JS 数组和对象的深拷贝操作,包括使用 JSON.parse 和 JSON.stringify 方法以及使用递归进行深拷贝。需要注意的是,以上两种方法都存在一些局限性,具体情况需要根据实际需求进行选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS 数组和对象的深拷贝操作示例 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JavaScript原生对象之Number对象的属性和方法详解

    以下是关于“JavaScript原生对象之Number对象的属性和方法详解”的完整攻略。 Number对象的介绍 JavaScript的Number对象代表数字,可以进行数学运算。Number对象是JavaScript中的原始值之一。Number对象有很多属性和方法,可以帮助我们在编写JavaScript程序时,更加方便地操作数字。 Number对象的属性 …

    JavaScript 2023年5月27日
    00
  • JavaScript 保存数组到Cookie的代码

    JavaScript 保存数组到 Cookie 主要涉及两个步骤:将数组转换为字符串形式并保存到 Cookie 中,以及从 Cookie 中获取数组并转换为 JavaScript 中的数组对象。以下是完整攻略: 将数组保存到 Cookie 中 1.首先需要将数组转换成字符串形式,可以使用 JSON 对象中的方法 JSON.stringify() 来实现。例如…

    JavaScript 2023年5月19日
    00
  • javascript:void(0)的真正含义实例分析

    JavaScript:void(0)的真正含义实例分析 在网页编程中,很多人都会用到 javascript:void(0) 这个常用的代码,这个代码经常用来作为 a 标签的 href 属性的值。那么这个字符串的含义究竟是什么呢?下面详细讲解一下。 JavaScript:void(0) 的含义 其实,javascript:void(0) 就是一句标准的 Jav…

    JavaScript 2023年6月11日
    00
  • 2019年百度前端工程师面试题(附答案)

    关于 “2019年百度前端工程师面试题(附答案)” 的完整攻略,我会从以下几个方面进行讲解: 答题技巧 题目分类 示例讲解 1. 答题技巧 首先,我们需要了解一些答题技巧,来帮助我们更好地回答面试题。 首先,阅读题目时一定要仔细,理解清楚题目要求和限制。 其次,如果遇到复杂的题目或者不理解的概念,不要惊慌,可以先思考一下如何简化问题,或者查看相关的资料。 除…

    JavaScript 2023年5月19日
    00
  • window.location.href的用法(动态输出跳转)

    关于window.location.href的用法,先来介绍一下它的基本概念。 window.location.href是一个引用当前页面的URL字符串,它可以动态地改变页面的路径,实现页面的跳转。通过设置window.location.href的值,可以让当前页面跳转到指定的URL地址。 以下是window.location.href的一些常见应用场景: …

    JavaScript 2023年6月11日
    00
  • Qt编写地图之实现跨平台功能

    Qt编写地图之实现跨平台功能 介绍 Qt是一个跨平台的C++图形界面应用程序开发框架,广泛应用于计算机图形学、人机交互、科学计算和数据可视化等领域。本文将介绍如何使用Qt编写一个跨平台的地图应用程序,并实现跨平台功能。 准备工作 在开始本文的实践部分之前,需要先安装Qt环境,可以从官网上下载安装包并按照提示安装,或者使用包管理器安装Qt。 实践部分 步骤一:…

    JavaScript 2023年5月28日
    00
  • 浅谈Vue使用Elementui修改默认的最快方法

    下面我来详细讲解如何使用Element UI修改Vue的默认主题样式。 安装 Element UI 首先需要安装Element UI,可以通过npm安装: npm install element-ui -S 引入 Element UI 在Vue项目的main.js文件中,引入Element UI的样式文件和js文件: import Vue from ‘vue…

    JavaScript 2023年6月10日
    00
  • JS获取一个表单字段中多条数据并转化为json格式

    要获取一个表单字段中多条数据并转化为JSON格式,可以按如下步骤进行: 获取表单字段的值 首先,需要获取表单字段的值。可以使用document.getElementsByName()方法来获取表单字段的所有值。 例如,表单中有一个名称为“fruit”的checkbox列表,它包含多个不同的水果,可以使用以下代码获取所选水果的值: var fruit = do…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部