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

让你彻底理解浅拷贝和深拷贝的区别是什么_怎么让文件无法拷贝在写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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 启动修复日志文件srttrail_haveged启动安装

    启动修复日志文件srttrail_haveged启动安装tar包安装logstash启动转systemctl

    2022年4月21日
    102
  • idea激活码在哪里看 Mac【2021.10最新】

    (idea激活码在哪里看 Mac)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsa…

    2022年3月27日
    64
  • Java的Scanner输入时,next()和nextLine()的区别[通俗易懂]

    Java的Scanner输入时,next()和nextLine()的区别[通俗易懂]nextLine()不要和其他next方法一起用!!!尤其nextLine()不要放在它们后面!!!这个问题已经坑了我好多次了,但是每次都没有在意,主要是没反应过来出现问题的原因。今天阿里内推测验,又被nextLine()狠狠坑了一下。逻辑思路都是对的,就输入的数据不对。因为限时半小时,所以时间比较紧张,最后还是没弄出来。后来百度查了两者区别,果然问题是出在这里,改完之后问题就解决了。可怜我的…

    2022年6月10日
    43
  • Linux 环境变量配置汇总

    Linux 环境变量配置汇总Linux环境变量配置汇总01、Linux环境变量配置02、Linux读取环境变量03、Linux环境变量配置方法一:exportPATH或者把PATH放在前面04、Linux环境变量配置方法二:vim~/.bashrc在最后一行加上05、Linux环境变量配置方法三:vim~/.bash_profile06、Linux环境变量配置方法四:vim/etc/bashrc07、Linux环境变量配置方法五:vim/etc/profile在最后一行加上08、Linux环境变量配置方法六:vim/et

    2022年5月30日
    53
  • Python_0b、0o、0x进制转换/原码、反码、补码[通俗易懂]

    Python_0b、0o、0x进制转换/原码、反码、补码[通俗易懂]4月28日学习总结:一、进制转换1.二进制0b、八进制0o和十六进制0x转换为十进制的方法:设目标数字为n,相关进制为x,将数字n从右向左分解,分别乘以x的零次方、一次方等并相加。2.十进制转换为二进制0b、八进制0o和十六进制0x的方法:设目标数字为n,相关进制为x,将n除以x至结果小于x,从下向上依次拼接各阶段余数。3.各进制互转的方法:2->8:重点是记住0o与0b的对应…

    2022年6月24日
    50
  • 对象数组(C++学习笔记 20)[通俗易懂]

    对象数组(C++学习笔记 20)[通俗易懂]一、对象数组的定义所谓对象数组,指每一个数组元素都是对象的数组,即若一个类有若干个对象,我们把这一系列的对象用一个数组来存放。对象数组的元素是对象,不仅具有数据成员,而且还有函数成员。定义一个一维数组的格式如下:类名数组名[下标表达式]与基本数据类型的数组一样,在使用对象数组时也只能访问单个数组元素,其一般形式为:数组名[下标].成员名在建立数组时,同样要调用构造函数。有几个数组元…

    2022年7月12日
    22

发表回复

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

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