JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)

JavaScript中的对象和数组复制可以使用浅拷贝和深拷贝的概念。在进行对象和数组复制时,使用的是复制原始值,而不是将原始值的引用作为新值传递。

浅拷贝

浅拷贝会创建一个新的对象或数组,然后将原始对象或数组的所有属性或元素复制到新的对象或数组中。新对象或数组中的属性或元素仍然指向原始对象或数组中的相同值。

创建浅拷贝有多种方法,其中最常见的方法是使用展开运算符或Object.assign()方法。

展开运算符

var original = {name: "alice", hobbies: ["reading", "swimming"]};
var copy = {...original};
// 等价于
// var copy = Object.assign({}, original);
console.log(copy); // {name: "alice", hobbies: ["reading", "swimming"]}

original.name = "bob";
original.hobbies[0] = "watching TV";
console.log(copy); // {name: "alice", hobbies: ["watching TV", "swimming"]}

此示例中,使用展开运算符将original对象复制到copy对象中。修改原始对象的值将不会影响副本对象中的值。但是,修改原始对象中数组的元素值会反映在副本对象中的数组中。

Object.assign()

var original = {name: "alice", hobbies: ["reading", "swimming"]};
var copy = Object.assign({}, original);
console.log(copy); // {name: "alice", hobbies: ["reading", "swimming"]}

original.name = "bob";
original.hobbies[0] = "watching TV";
console.log(copy); // {name: "alice", hobbies: ["watching TV", "swimming"]}

此示例中,使用Object.assign()将original对象复制到copy对象中。修改原始对象的值将不会影响副本对象中的值。但是,修改原始对象中数组的元素值会反映在副本对象中的数组中。

深拷贝

深拷贝会创建一个新的对象或数组,并将原始对象或数组中的所有属性或元素复制到新的对象或数组中。如果原始对象或数组中的属性或元素是对象或数组,则该属性或元素也将复制为新的对象或数组。

创建深层复制有多种方法,其中常见的方法是使用JSON.parse(JSON.stringify())、lodash库或递归函数。

JSON.parse(JSON.stringify())

var original = {name: "alice", hobbies: ["reading", "swimming"]};
var copy = JSON.parse(JSON.stringify(original));
console.log(copy); // {name: "alice", hobbies: ["reading", "swimming"]}

original.name = "bob";
original.hobbies[0] = "watching TV";
console.log(copy); // {name: "alice", hobbies: ["reading", "swimming"]}

此示例中,在原始对象上调用JSON.stringify()将其序列化为JSON字符串,然后再次调用JSON.parse()将其反序列化为JavaScript对象。新的copy对象包含与original对象相同的值,但它们指向不同的内存位置。修改原始对象的值将不会影响副本对象中的值。

但是,JSON.stringify()不能序列化undefined、正则表达式、函数、Symbol和其他可以在对象中使用的特殊对象类型,例如Map和Set。

lodash库

var _ = require("lodash");
var original = {name: "alice", hobbies: ["reading", "swimming"]};
var copy = _.cloneDeep(original);
console.log(copy); // {name: "alice", hobbies: ["reading", "swimming"]}

original.name = "bob";
original.hobbies[0] = "watching TV";
console.log(copy); // {name: "alice", hobbies: ["reading", "swimming"]}

这个实例中,使用lodash库的_.cloneDeep()函数创建一个深层复制。lodash库可以工作在客户端和服务器端,并处理函数、Symbol等对象类型。

递归函数

function deepClone(obj) {
    if (typeof obj !== "object" || obj === null) {
        return obj;
    }
    var clone = Array.isArray(obj) ? [] : {};
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            clone[key] = deepClone(obj[key]);
        }
    }
    return clone;
}
var original = {name: "alice", hobbies: ["reading", "swimming"]};
var copy = deepClone(original);
console.log(copy); // {name: "alice", hobbies: ["reading", "swimming"]}

original.name = "bob";
original.hobbies[0] = "watching TV";
console.log(copy); // {name: "alice", hobbies: ["reading", "swimming"]}

这个实例中,定义了一个名为deepClone()的递归函数,它处理对象和数组并返回其副本。如果传递给它的参数不是对象或数组,则直接返回参数。如果是对象或数组,则遍历它并复制其属性或元素。递归深度克隆对象,以便包含的对象和数组也被深度克隆。

上述函数可以实现数组的深拷贝,但是,当对象属性中含有函数或正则表达式等特殊类型时,可能出现问题。

以上是关于JavaScript基础心法深浅拷贝的完整攻略。其中包含了浅拷贝与深拷贝的定义、实现方式的详细讲解以及多个示例来说明相关概念的使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝) - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言 数组

    C语言数组的使用攻略 数组的概念 在C语言中,数组(Array)是一种可存储多个相同类型数据的结构。数组中的每个元素可以通过下标(int)来唯一确定。数组下标从0开始,最大下标为数组长度-1。 数组的声明 在C语言中,声明数组需要指定数组的类型和长度。以下是一个数组的声明示例: int array[5]; // 声明一个长度为5的int类型数组 数组的初始化…

    C 2023年5月9日
    00
  • C++ 学习之旅二 说一说C++头文件

    C++ 学习之旅二 说一说C++头文件 在C++编程中,我们有时需要引入头文件来使用其中的函数和变量等内容。那么什么是头文件?如何使用头文件呢?本文将从以下两个方面来详细讲解C++头文件的使用: 头文件的作用 如何使用头文件 头文件的作用 头文件(Header File)是一种特殊的文件,一般用来存放程序中的函数声明、define值和类声明等等。头文件的作用…

    C 2023年5月23日
    00
  • 使用VS2022开发在线远程编译部署的C++程序(图文详解)

    下面是使用VS2022开发在线远程编译部署的C++程序的完整攻略: 1. 准备工作 首先需要安装VS2022,然后在 “添加或删除程序” 中安装 Windows SDK 10(相关依赖) 和 远程工具(Remote tools)。 在准备使用远程编译部署之前,需要在远程计算机上安装Visual Studio 2022 Build Tools或Visual S…

    C 2023年5月23日
    00
  • Win7系统打开软件提示错误代码0xc0000022是什么原因?怎么解决?

    Win7系统打开软件提示错误代码0xc0000022的原因 当Windows 7系统出现错误代码0xc0000022时,表示发生了访问认证错误,无法打开指定的软件。这个错误有多种原因,其中两个最常见的原因是权限问题和受损的软件。 权限问题 如果您不具有打开某个软件的访问权限,则会触发此错误。当您在不具有管理员权限的用户账户下尝试打开受保护的应用程序或系统应用…

    C 2023年5月23日
    00
  • 使用C/C++读写.mat文件的方法详解

    使用C/C++读写.mat文件的方法详解 什么是.mat文件 .mat文件是一种MATLAB的数据格式,即它是MATLAB的数据文件。MATLAB(矩阵实验室)是美国MathWorks公司出品的商业数学软件。它主要用于算法开发、数据可视化、数据分析以及数值计算的统一性处理等。其数据的保存格式是以.mat文件格式进行保存的。 .mat文件的特点 .mat文件因…

    C 2023年5月23日
    00
  • C语言中如何进行代码重用?

    在 C 语言中,可以使用函数来实现代码重用。函数是一段可重用的代码块,它可以接收参数,执行一定的操作,然后返回结果。 以下是 C 语言中实现代码重用的步骤: 定义函数:使用 function_name() 关键字定义一个函数,并在花括号中输入函数操作的代码。 函数参数:在函数括号中可以定义函数参数,用于传递数据或变量。可以使用参数的默认值或者变量的地址来传递…

    C 2023年4月27日
    00
  • C语言中system()函数的用法总结

    下面我将详细讲解C语言中system()函数的用法总结。 1. system函数简介 system()函数是C语言中的一种库函数,它可以用来在程序中执行特定的外部命令,比如在Windows下运行cmd命令,执行变量设置等。 system()函数的函数原型为: int system(const char *command); 其中,command参数表示要执行…

    C 2023年5月23日
    00
  • C语言如何实现成绩等级判别

    下面是完整的攻略,希望能对你有所帮助。 C语言如何实现成绩等级判别 了解问题 在实现成绩等级判别之前,我们首先要了解这个问题的背景和具体的需求。这个问题一般出现在学生的成绩管理、考试分析等场景中,需要将学生的成绩按照一定的规则进行等级划分,以便对学生的学习情况进行分析和管理。 设计思路 在进行成绩等级判别的过程中,我们需要依据一定的成绩划分规则来进行计算。一…

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