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日

相关文章

  • 整理Java编程中常用的基本描述符与运算符

    针对这个问题,我将分为以下三个部分进行详细讲解: 基本描述符 运算符 示例说明 1. 基本描述符 在Java编程中,基本描述符是指可以用来修饰变量的关键字,常用的基本描述符包括以下几种: final:表示变量是只读的,即变量的值在定义之后不能再次被修改。 abstract:表示类或方法是抽象的,即不能直接实例化对象或调用方法,需要被继承或实现后才能使用。 s…

    C 2023年5月22日
    00
  • C语言实现扫雷小项目

    C语言实现扫雷小项目攻略 1. 确定游戏功能和数据结构 在开始编码前,首先需要确定扫雷游戏的基本功能和数据结构: 游戏功能:实现扫雷游戏的核心功能,包括地雷的生成、数字的计算、点击和标记等操作。 数据结构:定义并实现游戏所需的数据结构,如二维数组等。 2. 创建扫雷项目文件 创建一个新的C语言项目文件夹并进入该文件夹,输入以下命令: mkdir minesw…

    C 2023年5月23日
    00
  • 深入浅析C/C++ 的条件编译

    下面是“深入浅析C/C++ 的条件编译”的完整攻略。 目录 条件编译的介绍 C/C++ 的条件编译指令 条件编译的使用场合 示例1:利用条件编译实现跨平台编译 示例2:利用条件编译调试代码 条件编译的介绍 条件编译是一种通过在程序中加入条件语句,根据条件来选择编译程序的一部分还是全部程序的一种技术。在C/C++语言中,可以使用条件编译指令来实现条件编译。 在…

    C 2023年5月23日
    00
  • VScode如何调用KEIL-MDK

    一、安装插件 在VSCode中搜索并安装名为”Cortex-Debug”的插件。 安装插件后,按下F1键或Ctrl+Shift+P打开命令面板,在搜索框中输入”Cortex-Debug: Install GDB”,安装GDB。 二、安装Keil-MDK和ARM公司提供的软件包 下载并安装Keil-MDK,网址:https://www.keil.com/dem…

    C 2023年5月23日
    00
  • 拳皇14跳出0xc000007b怎么解决_跳出0xc000007b的解决方法(必看)

    拳皇14跳出0xc000007b怎么解决_跳出0xc000007b的解决方法(必看) 问题描述 拳皇14是一款非常受欢迎的格斗游戏,但是有些玩家在启动游戏时会遇到0xc000007b的错误提示,导致游戏无法正常运行。那么这个问题怎么解决呢?本文将为大家提供详细的解决方法。 解决方法 方法一:安装/修复DirectX 首先请确认您的电脑上已经安装了最新的Dir…

    C 2023年5月23日
    00
  • C++实现教职工信息管理系统

    C++实现教职工信息管理系统攻略 1. 确定需求 在开始编写代码之前,我们需要确定该教职工信息管理系统的需求,包括需要实现哪些功能、输入输出的格式等。 该系统需要实现的功能包括: 添加教职工信息 删除教职工信息 修改教职工信息 查询教职工信息 显示所有教职工信息 教职工信息需要包括: 姓名 工号 职称 部门 输入格式为: 添加教职工信息:姓名 工号 职称 部…

    C 2023年5月23日
    00
  • SpringBoot整合Redis入门之缓存数据的方法

    下面是 “SpringBoot整合Redis入门之缓存数据的方法” 的完整攻略。 简介 在高并发访问下,数据库成为了性能瓶颈,为了解决这个问题,我们可以加入缓存来减轻数据库的压力,提高网站的响应速度。Redis作为一个高性能的内存数据库,被广泛应用于缓存系统中。在SpringBoot中,通过RedisTemplate来实现redis的缓存数据。 环境准备 首…

    C 2023年5月23日
    00
  • 关键字和标识符的区别

    关键字(Keyword)和标识符(Identifier)是编程语言中的重要概念,两者经常被程序员混淆。本攻略将详细解释关键字和标识符的区别,为程序员提供清晰明了的理解。 关键字和标识符的概念解释 关键字是什么? 关键字是编程语言中的保留字,具有特殊含义,不能用作标识符命名变量、函数或其他实体。在编译器或解释器中,关键字会被特别处理,一般用于控制程序结构、数据…

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