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日

相关文章

  • javascript 一些用法小结

    Javascript 一些用法小结 本篇文章是针对Javascript初学者的一些用法小结,讲解了Javascript中常用的一些语法、函数、对象等,方便读者快速学会Javascript。 语法 变量声明 Javascript中可以用var、let、const三个关键字进行变量声明。 var关键字声明的变量为函数级作用域变量,可以在函数内任意位置使用,而在函…

    JavaScript 2023年5月18日
    00
  • JavaScript中的私有/静态属性介绍

    当我们谈到JavaScript中的“私有”和“静态”属性时,我们实际上是在谈论不同类型的属性。 私有属性 私有属性是指只能在类的内部使用的属性。这意味着它们不能通过类的实例或外部访问。为了理解私有属性,让我们来看一个简单的例子: class Person { #name = ”; set name(name) { this.#name = name; } …

    JavaScript 2023年6月10日
    00
  • 结合AJAX进行PHP开发之入门

    结合AJAX进行PHP开发之入门 的攻略如下: 1. AJAX 是什么? 首先来了解一下 AJAX。AJAX(Asynchronous JavaScript And XML) 即异步 JavaScript 和 XML 的技术组合,能够异步处理网页,实现局部刷新,并无需刷新整个页面。AJAX 使用 XmlHttpRequest 对象来向服务器发送请求和接收响应…

    JavaScript 2023年6月11日
    00
  • Javascript验证Visa和MasterCard信用卡号的方法

    验证信用卡号的一种常用方法是通过Luhn算法,该算法有一个基本的规则:把信用卡号从右往左依次编号为0到n,其中最右边一位编号为0,然后对于每个奇数编号的数字乘以二,如果乘以二后的结果大于9,则将结果的各位数字相加,得到一个两位数的数字。 接着,将所有乘以二的数字和除了乘以二的数字的和相加,如果得到的和可以被10整除,则该信用卡号为合法的信用卡号。以下是一个检…

    JavaScript 2023年6月10日
    00
  • js输出列表实现代码

    下面是实现JavaScript输出列表的完整攻略,包含以下四个步骤: 创建列表结构 添加列表项 将列表插入到HTML文档中 可选:自定义样式 1. 创建列表结构 在JavaScript中,可以使用createElement()方法创建新的HTML元素。为了创建一个列表,我们需要使用以下代码: const list = document.createEleme…

    JavaScript 2023年5月28日
    00
  • 利用javascript查看html源文件

    想要在网页中查看HTML源文件,可以使用JavaScript来实现。具体的实现方法如下: 使用document.documentElement.outerHTML属性,将整个HTML源代码保存在该属性中,并将其打印到控制台上。 console.log(document.documentElement.outerHTML); 使用该方法能够查看整个HTML文档…

    JavaScript 2023年5月27日
    00
  • 关于JavaScript中parseInt()的一个怪异行为解决

    关于JavaScript中parseInt()的一个怪异行为解决 在JavaScript中,parseInt()是一个常用的全局函数,用于将字符串转换为整数。但是在使用该函数时,有一些奇怪的行为需要注意。 parseInt()的奇怪行为 在解析数字字符串时,parseInt()函数除了将前导的零字符去掉之外,还会忽略其中的非数字字符。这意味着即使字符串中包含…

    JavaScript 2023年5月28日
    00
  • 无感知刷新Token示例简析

    针对“无感知刷新Token示例简析”,我将提供完整的攻略,分为以下几个部分:背景介绍、方案设计、示例说明及参考文献。 背景介绍 随着Web应用不断扩大的规模和复杂度,用户态Token的安全性逐渐成为了不容忽视的问题,攻击者可以通过钓鱼、中间人等手段,窃取用户的Token,进而对用户的数据造成损失。为了解决这个问题,开发者可以通过刷新Token的方式,定期更换…

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