详解JS数据类型的值拷贝函数(深拷贝)

以下是详解JS数据类型的值拷贝函数(深拷贝)的攻略:

什么是深拷贝

在 JS 中,我们把变量分为两类:基础类型和引用类型。基本类型的值直接存储在栈(stack)中,而引用类型的值存储在堆(heap)中,变量实际上是一个指针指向对应的地址。因此,基础类型变量的修改不影响其他变量,而引用类型变量的修改会影响所有指向同一地址的变量。而深拷贝就是将原始数据类型和引用数据类型中所有层级的数据都复制一份,形成一个新的数据,两者互不影响。

实现深拷贝的方法

1.递归实现深拷贝

function deepCopy(obj) {
    // 如果不是复杂类型,直接返回值
    if (typeof obj !== 'object') {
        return obj;
    }
    // 如果是数组类型,创建一个新数组
    if (Array.isArray(obj)) {
        const result = [];
        for (let i = 0; i < obj.length; i++) {
            result.push(deepCopy(obj[i]));
        }
        return result;
    }
    // 如果是对象类型,创建一个新对象
    const result = {};
    for (let key in obj) {
        result[key] = deepCopy(obj[key]);
    }
    return result;
}

2.JSON.parse和JSON.stringify实现深拷贝

这种实现方法的前提是原始数据必须是 JSON 可以表示的数据类型(如:对象、数组)。因为JSON.stringify只能序列化JSON可表示的数据类型。所以不能定义一些不支持的数据类型(如:函数)。

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

深拷贝的应用

1.利用递归实现深拷贝

// 需要复制的数组
const arr = [{
    name: 'Tom',
    age: 20
}, {
    name: 'Jack',
    age: 21
}];
// 复制数组
const copyArr = deepCopy(arr);
// 修改原数组的第一个元素名称
arr[0].name = 'Mary';
// 存在复制 结果 copyArr[0].name 仍旧是 'Tom'
console.log(copyArr[0].name);

2.利用JSON.parse和JSON.stringify实现深拷贝

// 需要复制的对象
const obj = {
    name: 'Tom',
    age: 20
};
// 复制对象
const copyObj = deepCopy(obj);
// 修改原对象名称
obj.name = 'Mary';
// 存在复制 结果 copyObj.name 仍旧是 'Tom'
console.log(copyObj.name);

以上就是详解JS数据类型的值拷贝函数(深拷贝)的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JS数据类型的值拷贝函数(深拷贝) - Python技术站

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

相关文章

  • Area 区域实现post提交数据的js写法

    Area 区域是HTML表单元素的一种。它允许在一个可编辑的区域内输入文本或代码。使用JavaScript,我们可以使用它来实现提交数据的功能,这些数据可以使用POST方法发送到服务器。 以下是实现Area 区域Post提交数据的基本步骤: 创建一个表单元素,其中包含一个Area 区域,指定一个ID用于JavaScript操作。 <form> &…

    JavaScript 2023年6月11日
    00
  • js数组去重常见的方法汇总(7种)

    下面我将详细讲解“js数组去重常见的方法汇总(7种)”。 一、引言 在JavaScript的实际开发中,经常会遇到需要对数组进行去重操作的情况。而JavaScript提供了多种方法来进行数组去重操作,下面将详细介绍七种常见的方法。 二、使用Set Set是ES6新引入的一种集合数据类型,它可以存储任意类型的唯一值。使用Set可以很方便地实现数组去重,只需要将…

    JavaScript 2023年5月27日
    00
  • 深入理解vue3中的reactive()

    当谈到Vue的响应式系统时,有一个重要的函数:reactive()。在Vue3中,reactive()是我们创建响应式对象的首选方法。 1. reactive()函数的作用 reactive()函数可将一个普通JavaScript对象转换为响应式对象,从而使对象的属性变为可观察和自动更新的。这意味着,当响应式对象的某个属性发生变化时,Vue会自动使用新的值重…

    JavaScript 2023年6月10日
    00
  • 动态调用CSS文件的JS代码

    动态调用 CSS 文件的 JS 代码是一种在页面加载时引入 CSS 文件的方式,这种方式可以使页面的开发更加灵活,可以根据不同的需求加载不同的 CSS 文件。下面是实现动态调用 CSS 文件的 JS 代码的完整攻略: 创建一个空的 link 元素 在页面中创建一个空的 link 元素,它的 href 属性指向 CSS 文件的路径,rel 属性为 styles…

    JavaScript 2023年6月11日
    00
  • ajax.net对数据库的插入实例

    关于”ajax.net对数据库的插入实例”,以下是详细的攻略: 准备工作 在开始编写代码前,我们需要完成以下准备工作: 安装Visual Studio。 配置数据库(SQL Server 或 MySQL)。 创建一个新网站(可以是WebForms项目或MVC项目),并在项目中添加对jQuery、Ajax.NET库的引用。 在准备工作完成后,我们可以开始编写代…

    JavaScript 2023年6月11日
    00
  • JS添加或删除HTML dom元素的方法实例分析

    关于“JS添加或删除HTML dom元素的方法实例分析”的攻略,我将会为您提供一些详尽的说明。 添加HTML DOM元素 使用 JavaScript 来动态添加 HTML DOM 元素,对于网站交互性、用户体验以及动画效果的实现是非常有帮助的。 1. 使用 createElement 方法添加元素 createElement 方法可以创建一个指定的 HTML…

    JavaScript 2023年6月10日
    00
  • JavaScript如何使用插值实现图像渐变

    JavaScript中使用插值实现图像渐变的步骤如下: 创建canvas元素,并设置其宽度、高度等属性。 <canvas id="canvas"></canvas> 获取canvas元素的2D上下文对象,用于绘图。 const canvas = document.getElementById(‘canvas’); …

    JavaScript 2023年6月10日
    00
  • 一起来学习JavaScript的BOM操作

    一起来学习JavaScript的BOM操作 什么是BOM BOM(浏览器对象模型)是指浏览器提供的一组API,用于控制浏览器窗口或标签页。我们可以使用BOM来操作浏览器窗口的大小、位置、前进后退等行为,以及判断当前浏览器类型、浏览器版本和语言。 BOM对象 BOM主要由4个对象组成: window对象:代表整个浏览器窗口,是BOM对象的最外层对象。 navi…

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