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

让我来详细讲解一下 “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日

相关文章

  • js与jQuery实现的兼容多浏览器Ajax请求实例

    针对“js与jQuery实现的兼容多浏览器Ajax请求实例”这一主题,我将提供以下完整攻略: 步骤1:引入jQuery库到你的项目中 使用jQuery库的最简单方式是从官网下载或链接CDN,并在你的项目中引入。以下是引入jQuery的示例代码: <!DOCTYPE html> <html> <head> <title…

    JavaScript 2023年6月11日
    00
  • Javascript入门学习第八篇 js dom节点属性说明第1/2页

    让我来为你讲解“Javascript入门学习第八篇 js dom节点属性说明第1/2页”的完整攻略。 理解 DOM 节点属性 DOM 节点是网页中的 HTML 元素,如文本、图像和按钮等。每个节点都有一些属性,这些属性用来指定节点的特征和状态。理解这些节点属性对于 Javascript 开发人员来说非常必要。 常见的 DOM 节点属性 常见的 DOM 节点属…

    JavaScript 2023年5月18日
    00
  • JavaScript String.replace函数参数实例说明

    JavaScript中的String.replace()函数通常用于替换文本内容,其参数包括要替换的内容、替换的新内容和可选的标志属性。 下面是一个示例代码,说明replace()函数的基本用法: let str = "Hello World!"; let newStr = str.replace("World", &…

    JavaScript 2023年5月28日
    00
  • JavaScript实现显示函数调用堆栈的方法

    要实现显示函数调用堆栈的功能,可以使用JavaScript内置的Error对象的堆栈跟踪机制。具体实现步骤如下: 1. 创建Error对象 JavaScript中Error对象表示运行时错误,它包含一个message属性和一个stack跟踪堆栈信息的属性。因此,可以使用new关键字来创建一个Error对象。 function printStackTrace(…

    JavaScript 2023年6月11日
    00
  • js Html结构转字符串形式显示代码

    下面我给您详细讲解一下如何将JS HTML结构转换成字符串形式显示代码的完整攻略。 一、概述 在前端开发中,我们经常需要将JS代码或HTML结构进行分享、展示,而将其转换为字符串形式展示,便于其他人查看和复制,这就需要使用到JS的一些方法。 二、常用方法 1. innerHTML innerHTML是JS中的一个属性,用于获取或设置元素的HTML内容,可以将…

    JavaScript 2023年5月19日
    00
  • js将列表组装成树结构的两种实现方式分享

    让我们来详细讲解“js将列表组装成树结构的两种实现方式分享”的完整攻略。 1. 背景 在开发网站时,经常会遇到需要将列表数据组装成树形结构的需求。比如,某个商品分类下有多个子分类,子分类又有自己的子分类,这就是一棵树形结构。如果我们只有一份列表数据,该如何将它组装成一棵树呢? 2. 实现方式一:递归 2.1 实现思路 递归是一种非常自然且直观的方法,它通过不…

    JavaScript 2023年5月27日
    00
  • 浅谈ECMAScript6新特性之let、const

    浅谈ECMAScript6新特性之let、const let 在ES6之前,JavaScript只有全局作用域和函数作用域,没有块级作用域,因此在一些复杂的嵌套逻辑中,变量声明和使用的容易混淆,let的出现就解决了这个问题。 块级作用域 let关键字可以声明块状作用域的变量,这个变量只在当前块级作用域有效。比如: function foo() { var b…

    JavaScript 2023年6月11日
    00
  • javascript 用函数实现继承详解

    下面是“javascript 用函数实现继承详解”的完整攻略,内容包括以下几部分: 什么是继承? 原型链继承 借用构造函数实现继承 组合继承 原型式继承 寄生式继承 寄生组合式继承 什么是继承? 继承是 JavaScript 中的一个重要概念,它允许我们可以在已有对象的基础上创建新的对象,并继承已有对象的属性和方法。通过继承,我们可以大大提高代码重用的效率,…

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