让你彻底理解浅拷贝和深拷贝的区别是什么_怎么让文件无法拷贝

让你彻底理解浅拷贝和深拷贝的区别是什么_怎么让文件无法拷贝在写js的时候经常会遇到复制对象,在复制对象的过程中往往会出现新对象改变原对象等等的一些问题,今天特意梳理一下,希望能帮助到遇到这些问题的开发人员。什么是浅拷贝,深拷贝以及和他们之间的区别赋值浅拷贝深拷贝在开始梳理之前先说一下值类型和引用类型:值类型(基本类型):字符串(string)、数值(number)、布尔值(boolean)、undefined、null;引用类型:对象(Object)、数组(Array)、函数(Function);1、什么是浅拷贝,深拷贝以及和他们之间的区别

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

在写js的时候经常会遇到复制对象,在复制对象的过程中往往会出现新对象改变原对象等等的一些问题,今天特意梳理一下,希望能帮助到遇到这些问题的开发人员。

  • 什么是浅拷贝,深拷贝以及和他们之间的区别
  • 赋值
  • 浅拷贝
  • 深拷贝

在开始梳理之前先说一下值类型和引用类型
值类型(基本类型):字符串(string)、数值(number)、布尔值(boolean)、undefined、null ;
引用类型:对象(Object)、数组(Array)、函数(Function);

1、什么是浅拷贝,深拷贝以及和他们之间的区别

  • 浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址
  • 深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象。
  • 区别:浅拷贝基本类型之前互不影响,引用类型其中一个对象改变了地址,就会影响另一个对象;深拷贝
    改变新对象不会影响原对象,他们之前互不影响。

2、赋值

//对象赋值
let obj1 = { 
    name: '张三', action: { 
    say: 'hi'};
let obj2 = obj1;
obj2.name = '李四';
obj2.action.say = 'hello'
console.log('obj1',obj1) 
// obj1 { name: '李四', action: { say: 'hello'}
console.log('obj2',obj2) 
// obj2 { name: '李四', action: { say: 'hello'}

3、浅拷贝

原数据中包含子对象,改变新对象会使原数据一同改变

  • Object.assign()
//浅拷贝
let obj1 = { 
    name: '张三', action: { 
    say: 'hi'};
let obj2 = Object.assign({ 
   }, obj1);
obj2.name = '李四';
obj2.action.say = 'hello'
console.log('obj1',obj1) 
// obj1 { name: '张三', action: { say: 'hello'}
console.log('obj2',obj2) 
// obj2 { name: '李四', action: { say: 'hello'}
  • 展开运算符…
    展开运算符是一个 es6特性,它提供了一种非常方便的方式来执行浅拷贝,这与 Object.assign ()的功能相同。
//浅拷贝
let obj1 = { 
    name: '张三', action: { 
    say: 'hi'};
let obj2 = { 
   ... obj1};
obj2.name = '李四';
obj2.action.say = 'hello'
console.log('obj1',obj1) 
// obj1 { name: '张三', action: { say: 'hello'}
console.log('obj2',obj2) 
// obj2 { name: '李四', action: { say: 'hello'}

注:concat(),slice()也属于浅拷贝

4、深拷贝

  • JSON.parse(JSON.stringify())
//深拷贝
let obj1 = { 
    name: '张三', action: { 
    say: 'hi'};
let obj2 = JSON.parse(JSON.stringify(obj1));
obj2.name = '李四';
obj2.action.say = 'hello'
console.log('obj1',obj1) 
// obj1 { name: '张三', action: { say: 'hi'}
console.log('obj2',obj2) 
// obj2 { name: '李四', action: { say: 'hello'}
  • jQuery.extend()
    $.extend(deepCopy, target, object1, [objectN])//第一个参数为true,就是深拷贝
//深拷贝
let obj1 = { 
    name: '张三', action: { 
    say: 'hi'};
let obj2 = $.extend(true, { 
   }, obj1);
obj2.name = '李四';
obj2.action.say = 'hello'
console.log('obj1',obj1) 
// obj1 { name: '张三', action: { say: 'hi'}
console.log('obj2',obj2) 
// obj2 { name: '李四', action: { say: 'hello'}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187148.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android之存储篇_SQLite数据库_让你彻底学会SQLite的使用「建议收藏」

    SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。但有一种情况例外:定义为INTEGERPRIMARYKEY的字段只能存储64位整数,当向这种字段保存除整数以外的数据时,将会产生错误。另外,SQLite在解析CR…

    2022年3月10日
    30
  • 基于知识图谱的知识推理

    基于知识图谱的知识推理这基于知识图谱的知识推理基本概念、定义推理方法分为三类:知识图推理的相关应用基于规则的推理基于表示学习的推理基于神经网络和强化学习的推理基本概念、定义人工智能算法必须具有推理能力,推理过程必须依赖于知识工程时代的先验知识和经验,大量知识图(KGs),如YAGO(Suchanek,Kasnki,2008),WordNet(Miller,1995),Freebase(Bollacker,Evans、Paritosh、Sturge和Taylor,2008)已经开发。KGs包含大量的先验知识,同时也能有效地组织

    2022年6月11日
    65
  • 吐槽一下Activiti用户手册和一本书

    吐槽一下Activiti用户手册和一本书

    2022年1月6日
    48
  • EM算法 实例讲解「建议收藏」

    EM算法 实例讲解「建议收藏」第一次接触EM算法,是在完成半隐马尔科夫算法大作业时。我先在网上下载了两份Baum-Welch算法的代码,通过复制粘贴,修修补补,用java实现了HMM算法(应用是韦小宝掷两种骰子的问题)。然后,参考有关半隐马尔科夫算法的论文,照着论文中的公式修改隐马尔科夫算法,完成了大作业。现在回想起来,就隐隐约约记得有一大堆公式。最近,我看到一篇很好的文章,对EM算法的计算有了进一步的了解,文章链接为http

    2022年6月22日
    27
  • labview示波器波形采集_labview制作简易示波器教程

    labview示波器波形采集_labview制作简易示波器教程前些日子,需要保存示波器图像,可惜身边没有U盘,于是在电脑上安装了keysightBenchVue,可惜不是免费的,只能用一个月;电脑上装有Labview软件,何不自己写一个呢?下载了keysight相关示波器的编程手册,写好命令序列,可是每次打开传过来的png截屏文件,都有问题,图片软件总是显示打不开。查找了NI论坛,终于找到了问题所在,原来是截图中的一个字符需要替换。截图命令如下…

    2022年10月12日
    0
  • 深入理解java注解的实现原理(转载)

    深入理解java注解的实现原理(转载)转自 深入理解 java 注解的实现原理今天将从以下 4 个方面来系统的学习一下 java 注解 什么是注解 注解的用途 注解使用演示 注解的实现原理 1 什么是注解注解也叫元数据 例如我们常见的 Override 和 Deprecated 注解是 JDK1 5 版本开始引入的一个特性 用于对代码进行说明 可以对包 类 接口 字段 方法参数 局部变量等进行注解一般

    2025年6月18日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号