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

相关文章

  • window.open打开页面居中显示的示例代码

    下面是关于如何使用JavaScript代码在浏览器中打开一个新页面并使其居中显示的攻略。 1. 创建一个新页面 首先,我们需要使用 window.open() 方法创建一个新的浏览器窗口,并且通过 document.write() 方法向其写入一些内容,例如: <script type="text/javascript"> v…

    JavaScript 2023年6月11日
    00
  • javascript时间戳和日期字符串相互转换代码(超简单)

    下面是详细讲解“javascript时间戳和日期字符串相互转换代码(超简单)”的攻略: 时间戳和日期字符串的定义 时间戳是1970年1月1日00:00:00(格林威治标准时间)起至现在的总秒数,通常为一个整数。 日期字符串是一个按照一定格式表示的时间文本,常用的格式包括“年-月-日 时:分:秒”、“月/日/年 时:分:秒”等。 时间戳转日期字符串 // 时间…

    JavaScript 2023年5月27日
    00
  • javascript中replace使用方法总结

    JavaScript中replace使用方法总结 replace()方法是JavaScript中字符串对象的一个常用方法,其作用是在字符串中搜索指定的子字符串或者正则表达式,并将其替换为新的子字符串。在本篇文章中,我们将对replace()方法进行详细的讲解和总结。 基本使用 replace()方法的基本语法如下: string.replace(search…

    JavaScript 2023年5月28日
    00
  • JS身份证信息验证正则表达式

    下面是JS身份证信息验证正则表达式的完整攻略: 什么是身份证号码 身份证号码是我国公民的唯一身份标识,由18位数字和字母组成,其中最后一位可能是数字或字母X,具有以下含义: 前6位是地址码,表示身份证持有人的行政区划代码; 7到14位是出生日期码,表示身份证持有人的出生年月日; 15到17位称为顺序码,表示在同一地址码区域内,对同年、同月、同日出生的人员编定…

    JavaScript 2023年5月19日
    00
  • ES6 let和const定义变量与常量的应用实例分析

    ES6 let和const定义变量与常量的应用实例分析 let的应用实例 示例1 // ES6之前 for(var i=0; i<5; i++) { setTimeout(function() { console.log(i) }, 1000) } // ES6之后 for(let i=0; i<5; i++) { setTimeout(func…

    JavaScript 2023年6月11日
    00
  • js使用cookie记录用户名的方法

    首先我们需要了解什么是cookie。Cookie是指通过浏览器访问网站时,服务器在本地硬盘上写入的一个小文本文件。通过Cookie存储的信息可以被网站读取,从而达到存储用户信息和状态的目的。 下面是使用JS来记录用户名的方法: 使用document.cookie来设置Cookie document.cookie = "username=张三&quo…

    JavaScript 2023年6月11日
    00
  • JavaScript遍历Json串浏览器输出的结果不统一问题

    问题描述: 在JavaScript中遍历Json字符串时,不同的浏览器会输出不同的结果,导致开发者难以准确依赖其输出结果,进而对程序的正确性进行判断。 问题原因: 不同浏览器对Json字符串的处理方式存在一些细微的差异,如浏览器可能会为Json对象的属性添加双引号或单引号,不同的浏览器可能会针对Json字符串采用不同的解析方式,未能完全遵循标准的Json格式…

    JavaScript 2023年5月27日
    00
  • 通过JavaScript下载文件到本地的方法(单文件)

    以下是通过JavaScript下载文件到本地的方法的完整攻略: 标准的下载方法 通过标准的HTML a标签和download属性可以实现文件的下载。该属性用于指定资源的下载地址,将会生成一个下载的链接。 <a href="文件地址" download="文件名">下载文件</a> 其中,href…

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