详解JS变量存储深拷贝和浅拷贝

详解JS变量存储深拷贝和浅拷贝

什么是拷贝?

拷贝是将原来的变量复制一份新的变量,使得新的变量与原变量相互独立,对新的变量的修改不会对原变量产生任何影响。

浅拷贝

在 JS 中,浅拷贝指的是将原始对象的引用复制给新的对象,如果原始对象发生变化,则新对象也会随之发生变化。示例如下:

const originalObj = {
  a: {
    b: 1
  },
  c: 2
}
const newObj = Object.assign({}, originalObj);
newObj.a.b = 3;
console.log(originalObj.a.b); // 3
console.log(newObj.a.b); // 3

可以看到,修改 newObj.a.b 后,originalObj.a.b 的值也改变了。

深拷贝

深拷贝是指将原始对象完全复制一份新的对象,使得新的对象与原始对象彻底独立,对新对象的修改不会影响到原始对象。实现深拷贝的方式有多种,下面列出其中几种实现方式。

方法一:递归

递归是一个很容易想到的方式,可以遍历对象的所有属性,然后逐一复制。示例如下:

function deepClone(obj) {
  const newObj = obj.constructor === Array ? [] : {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key];
    }
  }
  return newObj;
}
const originalObj = {
  a: {
    b: 1
  },
  c: 2
}
const newObj = deepClone(originalObj);
newObj.a.b = 3;
console.log(originalObj.a.b); // 1
console.log(newObj.a.b); // 3

可以看到,修改 newObj.a.b 后,originalObj.a.b 的值不会改变。

方法二:JSON.parse 和 JSON.stringify

由于 JSON 格式只能存储基本数据类型和简单对象类型,因此利用 JSON 格式序列化和反序列化可以实现深拷贝。示例如下:

const originalObj = {
  a: {
    b: 1
  },
  c: 2
}
const newObj = JSON.parse(JSON.stringify(originalObj));
newObj.a.b = 3;
console.log(originalObj.a.b); // 1
console.log(newObj.a.b); // 3

可以看到,修改 newObj.a.b 后,originalObj.a.b 的值不会改变。

总结

浅拷贝和深拷贝之间区别很大,浅拷贝只是复制了原始对象引用,而深拷贝复制了整个对象。实现深拷贝的方式多种多样,需要根据实际需求选择不同的方式进行实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JS变量存储深拷贝和浅拷贝 - Python技术站

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

相关文章

  • .net中捕捉全局未处理异常的三种方式示例

    接下来我将为你详细讲解如何在.NET中捕捉全局未处理异常,共有三种方式: 方式一:使用UnobservedTaskException事件 使用方式如下: TaskScheduler.UnobservedTaskException += (sender, args) => { // 处理未处理异常的代码 args.SetObserved(); }; 通过…

    C 2023年5月23日
    00
  • VC实现ODBC数据库操作实例解析

    VC实现ODBC数据库操作实例解析 什么是ODBC ODBC是开放数据库连接(Open Database Connectivity)的简称。它提供了一种标准的接口方式,使得应用程序可以通过一组标准的API函数与各种数据库打交道。ODBC是由微软公司所提出、在1992年获得了国际标准的接口规范,因此,ODBC接口已经成为了连接各种不同数据库标准的事实标准。一般…

    C 2023年5月22日
    00
  • 详解C++11中的线程锁和条件变量

    详解C++11中的线程锁和条件变量 C++11中提供了一系列的线程同步机制,包括线程锁和条件变量。线程锁主要是为了保护共享资源,防止多个线程同时对同一块内存区域进行操作而发生冲突;而条件变量则主要是为了线程之间的协作,当一个线程等待某个条件成立时,可以通过条件变量来阻塞当前线程,直到条件被满足为止。 线程锁 Mutex Mutex(互斥锁)是最基本的线程锁,…

    C 2023年5月22日
    00
  • 少女前线新手最全面入门指南 阵容搭配及枪娘选择攻略

    少女前线新手最全面入门指南 前言 《少女前线》是一款枪械题材的卡牌养成游戏,深受广大玩家喜爱。然而,对于新手来说,玩法和系统繁琐复杂,很容易迷失方向。因此,本篇文章将为各位新手提供一份全方位的入门指南,帮助大家快速了解游戏,并通过合理的阵容搭配和枪娘选择攻略,提高游戏体验。 入门指南 1. 完成游戏引导流程 在刚进入游戏时,请务必按照游戏引导流程逐步完成任务…

    C 2023年5月22日
    00
  • C语言实现单词小帮手

    C语言实现单词小帮手攻略 介绍 单词小帮手是一个简单的命令行工具,可以将输入的英文单词翻译为中文,并给出其中文释义、发音、例句等信息。本攻略将会详细讲解如何使用C语言实现单词小帮手。 步骤 1. 数据获取 单词小帮手需要获取两种数据:英文单词和其翻译信息。我们可以通过以下方法获取这些数据: 使用爬虫抓取在线词典的数据 从一个本地的词库文件中读取数据 在有网络…

    C 2023年5月23日
    00
  • C++迷宫的实现代码

    首先,需要明确迷宫的概念。迷宫可以看做是由不同的格子组成的二维数组,每个格子可以表示为”#”或” “,其中”#”表示障碍物,不能通过,” “表示可以通过。迷宫的路径可以看做是从起点到终点的一条路径,这条路径在迷宫的二维数组中表示为一条由” “组成的连续序列。下面给出实现迷宫的C++代码攻略。 步骤一:定义迷宫 我们可以通过二维数组来定义迷宫,每个格子可以表示…

    C 2023年5月24日
    00
  • c++ 开发中如何读写yaml配置文件

    C++ 开发中读写 YAML 配置文件是常见的需求,它允许我们在应用程序中轻松地加载和修改配置选项。本文将提供如何使用 C++ 读写 YAML 配置文件的详细攻略,包括安装 YAML 解析器库、代码示例等。 安装 YAML 解析器库 C++ 没有内置解析 YAML 的功能,需要使用第三方库来解析 YAML 文件。目前比较常用的 YAML 解析器库有 YAML…

    C 2023年5月23日
    00
  • C 程序 查找给定范围内的素数

    下面是C程序查找给定范围内素数的完整使用攻略。 程序简介 这个C程序的主要功能是查找给定范围内的素数。用户需要输入一个起始数值和一个结束数值,程序会输出这个范围内的所有素数。程序的具体实现方式是使用了一个嵌套的for循环进行遍历,逐个判断每个数是否是素数。 使用方法 克隆或下载程序的源代码; 打开终端或命令提示符; 切换到程序的源代码目录; 使用C编译器编译…

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