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

yizhihongxing

以下是详解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.event.srcElement效果的可兼容性的函数

    替代window.event.srcElement的可兼容性函数,可以使用event.target属性来获取触发事件的元素。但是需要注意的是,此方法在IE8及以下版本不兼容,需要做兼容处理。 下面是完整的攻略,包含两条示例说明: 1. 使用event.target属性获取元素 使用event.target属性可获取触发事件的元素,示例如下: function…

    JavaScript 2023年6月10日
    00
  • 如何用javascript控制上传文件的大小

    当我们需要上传文件时,通常需要限制文件大小以确保上传的文件尺寸在合理范围内。在javascript中,我们可以使用以下方法来控制上传文件的大小。 1. 使用input元素限制文件大小 在HTML中,我们可以使用input元素来处理文件上传。如果我们将input元素的type属性设置为file类型,则该元素将允许用户选择本地计算机上的文件,并在提交提交表单时将…

    JavaScript 2023年5月27日
    00
  • JavaScript定义函数的三种实现方法

    下面就为大家详细讲解JavaScript定义函数的三种实现方法。 方法一:函数声明 函数声明是定义函数的最基本方法。 语法格式如下: function functionName(arg1, arg2, …) { //函数体 } 其中 functionName 是函数名,arg1, arg2, … 是形参,函数体可以是任意 JavaScript 代码。…

    JavaScript 2023年5月27日
    00
  • 基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)

    首先讲一下所需工具: touch.js:一款轻量级的移动端手势库,用于实现图片的缩放、滑动等手势操作; Zepto.js:一款轻量级的JavaScript库,可用于DOM操作、事件绑定等常见操作。 如果你已经准备好了这些工具,接下来我们就可以开始制作基于touch.js和Zepto.js的图片查看器了。 步骤一、创建HTML结构 首先我们需要先创建出HTML…

    JavaScript 2023年6月11日
    00
  • javascript面向对象的方式实现的弹出层效果代码

    JavaScript中面向对象编程(Object-Oriented Programming,简称OOP)是一种常见的编程方式,通过将数据属性和方法封装在对象中,实现了代码的复用性、可读性和可维护性。本文将从实现弹出层效果的角度,详细讲解如何使用JavaScript面向对象的方式实现弹出层效果的代码。 构建弹出层对象 首先,我们需要创建一个弹出层对象。这个对象…

    JavaScript 2023年6月10日
    00
  • 什么是JavaScript

    JavaScript是一种脚本语言,是用于Web开发的一种编程语言,在网页中主要负责实现交互效果和动态效果,如:表单校验、动画效果、音频视频控制、数据可视化等功能。 JavaScript最初由Netscape公司开发,在1995年被首次引入网页中,从此开始成为解决客户端Web开发的主要语言之一。现在,JavaScript已经发展成为一种非常强大、灵活、广泛应…

    JavaScript 2023年5月17日
    00
  • js导出excel文件的简洁方法(推荐)

    下面是“js导出excel文件的简洁方法(推荐)”的完整攻略。 1. 前置知识 要实现js导出excel文件,需要了解以下知识: Blob对象:Blob 对象表示一个不可变、原始数据的类文件对象。Blob 表示的不一定是JavaScript原生格式的数据。文件类型的二进制数据也可以从一个 Blob 中读取。 URL.createObjectURL():该方法…

    JavaScript 2023年5月27日
    00
  • 如何判断元素是否为HTMLElement元素

    如果要判断一个元素是否为 HTMLElement 元素,我们可以使用 JavaScript 自带的 instanceof 方法。 示例 1:使用 instanceof 方法判断元素是否为 HTMLElement 元素 // 获取 HTML 元素 const el = document.querySelector(‘div’); // 判断元素是否为 HTML…

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