浅析javaScript中的浅拷贝和深拷贝

yizhihongxing

浅析JavaScript中的浅拷贝和深拷贝

拷贝是什么

在JavaScript中,我们通常把拷贝称之为复制或者克隆,这里的拷贝是指将一个变量的值复制到另一个变量或对象中的过程。但是在拷贝的过程中,存在一种不同的拷贝方式,即浅拷贝和深拷贝。

浅拷贝

浅拷贝(Shallow Copy)是指将一个对象复制到另一个对象中,只是将对象的引用复制了过去,而不是对对象进行拷贝。这种复制方式只是拷贝了对象的基本属性,而不是复制整个对象,因此两个对象仍然共享相同的内存地址。当其中一个对象的值发生改变时,另一个对象的值也会发生改变。

示例:

let obj1 = {
  name: 'Tom',
  age: 18,
  hobbies: ['music', 'reading']
};

let obj2 = Object.assign({}, obj1);

obj2.age = 20;
obj2.hobbies.push('travelling');

console.log(obj1);
console.log(obj2);

在上述示例中,我们使用了Object.assign()方法进行浅拷贝。将obj1的值复制到obj2中,然后修改obj2的值,发现obj1的值未变,但是obj1和obj2的hobbies属性引用的数组是同一个,因此在修改obj2的hobbies属性时,obj1的hobbies属性也会跟着改变。

深拷贝

深拷贝(Deep Copy)是指将一个对象完全复制到另一个对象中,包括对象的引用和值,如果两个对象互相独立,那么其中一个对象的值发生改变时,另一个对象的值不会发生任何改变。

示例:

let obj1 = {
  name: 'Tom',
  age: 18,
  hobbies: ['music', 'reading']
};

let obj2 = JSON.parse(JSON.stringify(obj1));

obj2.age = 20;
obj2.hobbies.push('travelling');

console.log(obj1);
console.log(obj2);

在上述示例中,我们使用了JSON.parse(JSON.stringify())方法进行深拷贝。首先将obj1转换为JSON格式的字符串,再将JSON格式字符串转换为新的对象obj2。由于使用JSON.parse()方法时,会创建一个新的对象,因此obj1和obj2是不同的对象,obj2的修改不会影响obj1的值。

但是需要注意的是,深拷贝也有一些限制。例如,如果对象中存在循环引用或函数等特殊数据类型,深拷贝就无法进行。在这种情况下,我们需要使用其他的实现方法来进行拷贝。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析javaScript中的浅拷贝和深拷贝 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JS正则截取两个字符串之间及字符串前后内容的方法

    让我来为您详细讲解“JS正则截取两个字符串之间及字符串前后内容的方法”的完整攻略。 正则截取两个字符串之间 如果您需要截取两个字符串中间的内容,可以使用正则表达式来完成。使用正则表达式的match方法,可以传入一个正则表达式,返回匹配到的字符串数组。 示例: const str = ‘hello world, my name is Jack’; const …

    JavaScript 2023年5月28日
    00
  • CesiumJS源码杂谈之从光到 Uniform

    下面是关于“CesiumJS源码杂谈之从光到Uniform”的完整攻略的详细讲解。 前置知识 在讲解这个话题之前,需要对一些基本的知识有一定的了解。包括:WebGL的基础知识、Shader的基础知识、CesiumJS的基础知识等。 从光开始 在WebGL的渲染过程中,光是非常重要的一个环节。CesiumJS中的光源主要有以下几种: sun:太阳光。 moon…

    JavaScript 2023年6月10日
    00
  • js实现简单抽奖小功能

    下面是我给出的详细讲解: 概述 实现简单抽奖小功能,需要以下几个步骤: 1.准备随机数据池; 2.编写一个生成随机数的函数; 3.获取抽奖结果,并展示给用户。 下面我将详细介绍每一个步骤的实现过程。 准备随机数据池 准备随机数据池要根据实际情况来定,可以是一个固定的数组,也可以是后台返回的数据。在本示例中,我们准备一个包含5个抽奖奖品的数组: var pri…

    JavaScript 2023年6月11日
    00
  • js判断一个对象是数组(函数)的方法实例

    下面是关于“js判断一个对象是数组(函数)的方法实例”的完整攻略。 判断一个对象是数组的方法 在 JavaScript 中判断一个对象是否为数组的方法有很多种,下面介绍两种比较常用的方法。 方法一:使用 Array.isArray() 使用 Array.isArray() 可以判断一个对象是否为数组,同时可以避免使用 typeof 判断的弊端。 示例代码如下…

    JavaScript 2023年5月27日
    00
  • 用JavaScrip正则表达式验证form表单的方法

    下面是使用JavaScript正则表达式验证表单的攻略: 一、需求分析 JavaScript正则表达式可以对表单中的输入内容进行有效地验证。在使用正则表达式之前,首先需要明确以下几点: 要验证哪些内容,如表单中的用户名、密码、邮箱等; 需要验证的内容的限制条件,如密码必须包含大小写字母和数字等; 如果验证不通过,需要如何提示用户进行正确的输入。 二、编写正则…

    JavaScript 2023年6月10日
    00
  • javascript实现将数字转成千分位的方法小结【5种方式】

    下面是讲解“JavaScript实现将数字转成千分位的方法小结【5种方式】”的完整攻略。 什么是千分位? 千分位是指将数字每隔三位加一个逗号表示的形式,比如:“1,234,567”。 为什么要使用千分位? 使用千分位可以使数字更加易读,尤其是对于大的数字更加方便观察。 实现方式 以下是五种JavaScript实现将数字转成千分位的方法: 方法一:toFixe…

    JavaScript 2023年5月28日
    00
  • js 时间函数应用加、减、比较、格式转换的示例代码

    下面是关于 JavaScript 时间函数的应用攻略: 获取当前时间 使用 Date() 构造函数获取当前时间。 const now = new Date(); console.log(now); // 输出当前时间 同时,还可以使用 getTime() 方法获取当前时间的时间戳。 const now = new Date(); console.log(no…

    JavaScript 2023年5月27日
    00
  • 硬件工程师培训教程(一)

    硬件工程师培训教程(一)——完整攻略 一、学习前的准备 在学习硬件工程师培训教程前,需要具备以下基础: 熟悉基本的电路学知识,如欧姆定律、基本电路等; 具备基本的编程语言知识,如C语言等; 熟悉常见的硬件电路元器件,如电阻、电容等。 二、学习内容 1. 掌握硬件设计流程 硬件设计流程主要包括需求分析、电路设计、PCB设计、调试等环节。理解这些环节的意义和流程…

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