豆芽今天来谈一谈深拷贝和浅拷贝的区别和使用的方法。

二者的区别

区别建立在针对引用类型

浅拷贝:重新在堆中创建内存,拷贝前后对象的基本数据类型互不影响,但拷贝前后对象的引用类型因共享同一块内存,会相互影响。

深拷贝:从堆内存中开辟一个新的区域存放新对象,对对象中的子对象进行递归拷贝,前后的两个对象互不影响。

那么从简单的语言来说浅拷贝和深拷贝的区别,浅拷贝复制对象,当原对象改变的时候,复制对象也随之改变,而深拷贝复制对象,当原对象改变的时候,复制对象不会随着改变。

实现浅拷贝和深拷贝的方法

实现浅拷贝的方法

注意点:浅拷贝在第一层修改的时候新旧值不会发生变化,第二层开始,修改发生改变
1、Object.assign

let resList = { name: { resName: '曹豆芽' }, age: 21 };
let resListCopy = Object.assign({},resList);
resListCopy.name.resName = "小豆芽";
console.log(resList);
console.log(resListCopy);


我们可以很明显的看到resListCopy的对象值碰到改变的时候,resListCopy的值也随之改变。

2、concat浅拷贝数组

let resList = ['曹', '豆', '芽', { name: '曹豆芽' }];
let resListCopy = resList.concat();
resListCopy[3].name = "小豆芽";
console.log(resList);
console.log(resListCopy);


这里会发现当操作数组对象的值的时候,新旧的值都发生了变化。
3、slice浅拷贝

let resList = [{name:'曹豆芽'},1,2,3,4,5];
let resListCopy = resList.slice();
resListCopy[0].name = '小豆芽';console.log(resListCopy);
console.log(resList);


这里会发现当操作数组对象的值的时候,新旧的值都发生了变化。

4、…展开运算符

let resList = [{name:'曹豆芽'},1,2,3,4,5];
let resListCopy = [...resList];
resListCopy[0].name = '小豆芽';console.log(resListCopy);
console.log(resList);


同样也是一样这里会发现当操作数组对象的值的时候,新旧的值都发生了变化。

5.Array.from()

let resList = [{ name: '曹豆芽' }, 1, 2, 3, 4, 5];
let resListCopy = Array.from(resList);
resListCopy[0].name = '小豆芽';
console.log(resListCopy);
console.log(resList);


同样也是一样这里会发现当操作数组对象的值的时候,新旧的值都发生了变化。
6、手动实现

let resList = { name: { resName: "曹豆芽" }, age: 21 };
function beanSprouts(obj) {let target = {};for (let i in obj) {if (obj.hasOwnProperty(i)) {target[i] = obj[i];}}return target;
}
let resListCopy = beanSprouts(resList);
resListCopy.name.resName = '小豆芽';
console.log(resListCopy);
console.log(resList);


同样也是一样这里会发现当操作对象的值的时候,新旧的值都发生了变化。

实现深拷贝的方法

1.JSON.parse(JSON.stringify())

let resList = { name: { resName: '曹豆芽' }, age: 21 };
let resListCopy = JSON.parse(JSON.stringify(resList))
resListCopy.name.resName = "小豆芽";
console.log(resList);
console.log(resListCopy);

改变数据新对象发生改变,旧对象不改变。

2.手写实现(递归)

let resList = { name: { resName: "曹豆芽" } }
function beanSprouts(obj) {let data = Array.isArray(obj) ? [] : {};if (obj && typeof obj === "object") {for (key in obj) {if (obj.hasOwnProperty(key)) {//判断ojb子元素是否为对象,如果是,递归复制if (obj[key] && typeof obj[key] === "object") {data[key] = beanSprouts(obj[key]);} else {//如果不是对象,简单复制data[key] = obj[key];}}}}return data;
}
let resListCopy = beanSprouts(resList)
resListCopy.name.resName = '小豆芽';
console.log(resList);
console.log(resListCopy);


同样这个时候我们会发现多次嵌套的值改变,新数据改变,就数据没有改变。

欢迎大家补充交流浅拷贝和深拷贝的方法

来谈一谈深拷贝和浅拷贝的方法?相关推荐

  1. 浅谈对象的深拷贝和浅拷贝

    浅谈对象的深拷贝和浅拷贝 一.为什么使用对象的拷贝? 1.在普通数据类型赋值 let a=10let b=aa=20console.log(a)//a=20console.log(a)//b=10 因 ...

  2. python深拷贝和浅拷贝的使用场景_Python深拷贝和浅拷贝使用方法

    Python深拷贝和浅拷贝使用方法 发布时间:2020-06-06 16:52:01 来源:亿速云 阅读:182 这篇文章运用了实例代码展示Python深拷贝和浅拷贝使用方法,代码非常详细,可供感兴趣 ...

  3. 浅谈对java深拷贝与浅拷贝的理解

    java中什么是浅拷贝?什么是深拷贝? 1.拷贝:实现对象复制的方式. 2.浅拷贝:被复制的对象的所有变量都含有原来对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之, 浅拷贝仅仅复制所 ...

  4. 吉米_王:浅谈深拷贝和浅拷贝异同点

    深拷贝和浅拷贝 在正式聊深拷贝和浅拷贝之前,首先谈一个话题,数据类型是否可变? 可变类型:深拷贝和浅拷贝是有明显区别的: 不可变类型:深拷贝和浅拷贝没有区别,本质上都没有进行拷贝,而是内存意义上的指向 ...

  5. vue对象深拷贝_浅谈深拷贝和浅拷贝

    深拷贝和浅拷贝 说起深拷贝和浅拷贝,首先我们来看两个栗子 // 栗子1 var a = 1,b=a; console.log(a); console.log(b) b = 2; console.log ...

  6. 谈一谈浅拷贝和深拷贝

    深拷贝和浅拷贝是两种JavaScript中常见的变量赋值方式.假设有一个对象obj,它包含了若干属性和方法,请看下面的讲解: 浅拷贝 在对象的浅拷贝中,新对象只是简单地复制原始对象在内存中存储的地址, ...

  7. 通俗易懂讲解JavaScript深拷贝和浅拷贝

    基本类型和引用类型 在开始讲解JavaScript的深拷贝和浅拷贝之前,先要认识JavaScript的两种基本数据类型.一种是基本类型(值类型),另外一种是引用类型.其中基本类型包括undefined ...

  8. java 深拷贝_java 深拷贝与浅拷贝机制详解

    java 深拷贝与浅拷贝机制详解 概要: 在Java中,拷贝分为深拷贝和浅拷贝两种.java在公共超类Object中实现了一种叫做clone的方法,这种方法clone出来的新对象为浅拷贝,而通过自己定 ...

  9. 栈在前端中的应用,顺便再了解下深拷贝和浅拷贝!

    详解栈在前端中的应用 一.栈是什么 二.栈的应用场景 三.前端与栈:深拷贝与浅拷贝 1.JS数据类型 (1)js数据类型的分类 (2)js数据类型的定义和存储方式 (3)js数据类型的判断方式 2.深 ...

最新文章

  1. Git基础(常用命令)介绍
  2. jenkins自动化工具使用教程(转)
  3. Linux/Unix/Mac 系统GIT密码存储
  4. Elasticsearch Painless Script详解
  5. python集合类型一般应用的场景包括_Python学习,数据类型,python,篇
  6. ADO.NET Entity Framework学习笔记(4)ObjectQuery对象
  7. POJ-2456.Aggressivecows.(二分求解最大化最小值)
  8. php实现开关效果代码,JavaScript实现开关效果的代码分享
  9. 中科恒伦助力长江电力移动办公平台账号加固
  10. 有关计算机方面的知识竞赛,关于计算机知识竞赛试题
  11. 亲测可用企业级自动发卡平台PHP系统源码
  12. Flink 异步IO
  13. 关于混合app 开发框架Ionic
  14. [UVALive 4490] Help Bubu
  15. gorm中一对一,多对多关系
  16. vue中控制浏览器滚动
  17. 浙江独立学院计算机专业排名2015,2018中国独立学院排行榜发布,浙江这所独立学院独占鳌头!...
  18. 51单片机入门——STC89C52RC控制步进电机进行转动、调速
  19. matlab中Rip是什么意思,rip什么意思(rip是指安息的意思吗?)
  20. Unity 2D游戏开发案例学习——Robble Swifthand(下)

热门文章

  1. buuctf-misc-[BJDCTF2020]认真你就输了
  2. 银河麒麟V10-SP2服务器操作系统安装vnc
  3. 【百度智能云】教程:连接百度ai开放平台api接口并完成语音识别的任务
  4. 词云wordcloud
  5. JS. 东方航空从北京飞往马尔代夫的机票原价为4000元, 4到10月份为旺季,其他月份为淡季, 旺季头等舱打9折,经济舱打7.5折; 淡季头等舱打6折,经济舱打3折。
  6. HASH和HMAC(1):HASH和HMAC概述
  7. 【win10系统】win10系统蓝牙开关消失如何解决
  8. 盒子模型--万物皆盒子
  9. 互联网的源码时代,区块链蒸蒸日上
  10. 总结分享:怎么做好一个性能测试?