详解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日

相关文章

  • javascript在线编码查询工具

    基本介绍 “javascript在线编码查询工具”是一款web应用程序,可以用来编码和解码经常在javascript编程中使用的不同数据类型,比如文字、URL、base64等等。这个工具可以通过浏览器使用,不需要安装或者配置过程。下面我们来详细介绍如何使用这个工具。 使用步骤 打开 javascript在线编码查询工具网站:https://www.sojso…

    JavaScript 2023年5月20日
    00
  • js特殊字符过滤的示例代码

    JS特殊字符过滤是一种常见的前端技术,其目的是为了防止恶意注入脚本,保护网站安全性。下面,我们将介绍几种常见的JS特殊字符过滤代码。 基于字符编码的过滤 字符编码过滤的基本原理是将所有可能的JS特殊字符进行相应的编码,在输出时将编码重新转换为原有字符。常用的字符编码有HTML的&和”,URL的%20等。 以下是一个简单的示例: function ht…

    JavaScript 2023年6月10日
    00
  • JS实现的字符串数组去重功能小结

    好的。下面是关于“JS实现的字符串数组去重功能小结”的完整攻略: 介绍 在JavaScript程序中,经常需要使用数组进行数据的存储和操作。实际开发中,可能会出现数组中包含重复的元素的情况,所以需要对数组进行去重操作。本文将详细讲解JS实现的字符串数组去重功能的实现方法。 方法一:创建一个空的对象,利用对象属性的唯一性去重 代码示例: function ar…

    JavaScript 2023年5月28日
    00
  • JS数组reduce你不得不知道的25个高级用法

    下面我来为你详细讲解“JS数组reduce你不得不知道的25个高级用法”的完整攻略。 1. 什么是reduce? reduce() 方法用于对数组中的所有元素依次执行指定的回调函数,并将其缩减为单个值。这个值就是最后的返回值。reduce() 方法可以接收两个参数:回调函数和初始值。 一个简单的示例如下: let arr = [1, 2, 3, 4, 5];…

    JavaScript 2023年5月27日
    00
  • JS数组降维的几种方法详解

    JS数组降维是指将多维数组转换为一维数组。本文将详细讲解JS数组降维的几种方法,包括使用reduce()方法、ES6中的展开运算符和concat()方法等。 一、使用reduce()方法 reduce()方法接收两个参数,第一个参数是一个回调函数,第二个参数是累加器的初始值。回调函数接收两个参数,第一个参数是累加器的值,第二个参数是当前元素的值。在回调函数中…

    JavaScript 2023年5月27日
    00
  • JS前端组件注册与画布渲染实例

    下面是“JS前端组件注册与画布渲染实例”的完整攻略。 什么是JS前端组件注册? JS前端组件注册是指将一些可复用的DOM组件封装成组件库,以便在多个页面或应用程序中重复使用。其中,组件包括但不限于按钮、表单、下拉框、弹出框等等。 常见的JS前端组件库有:Bootstrap、Element UI、Ant Design等。 组件注册通常需要以下几个步骤: 为组件…

    JavaScript 2023年6月11日
    00
  • IP查询系统的异步回调案例

    IP查询系统的异步回调案例可以分为以下几个步骤: 1.向第三方IP查询系统发出请求,获取IP信息。 2.解析获取到的IP信息,提取需要的数据。 3.对提取到的数据进行存储和处理。 4.将处理完成后的数据通过异步回调的方式返回给用户。 以下是详细的攻略: 第一步:请求IP信息 在代码中,这一步可以使用HTTP请求库向第三方IP查询系统发起GET请求,获取用户输…

    JavaScript 2023年5月28日
    00
  • 给js文件传参数(详解)

    下面是一份详细的“给js文件传参数(详解)”攻略。 什么是给JS文件传参数? 在网页开发中,经常需要使用 JavaScript 来完成各种交互效果和页面逻辑。而在这些 JavaScript 文件中,有时需要引用一些外部数据,比如页面的标题、用户输入的某些值等。这时候就需要通过给 JS 文件传递参数来实现。 通俗地说,就是将一些数据从网页传递给 JS 文件,让…

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