深拷贝与浅拷贝的相关知识及区别

目录

一、深拷贝与浅拷贝的定义

什么是深拷贝(deepCopy):

什么是浅拷贝(shallowCopy):

二、举个栗子

1、浅拷贝

2、深拷贝

三、深拷贝与浅拷贝的区别


一、深拷贝与浅拷贝的定义

什么是深拷贝(deepCopy):

深拷贝复制变量值,对于引用数据,则递归至基本类型后,在复制。深拷贝后的对象与原来的对象是完全隔离的,互不影响,拷贝对象最表层的数据

简单来说:是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存。就是在计算机中开辟一个新的内存地址用于存放复制的对象。

什么是浅拷贝(shallowCopy):

是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用当引用指向的值发生改变时也会跟着改变,拷贝对象的各个层级的属性。

简单来说:就是只是增加了一个指针指向已存在的内存地址。仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会发生改变

二、举个栗子

1、浅拷贝

var arr = [7,8,9];// 一维数组
var a = arr.slice();// 实现数组的浅拷贝
a[0] = 9;
console.log(arr[0]);
console.log(a[0])

//此时输出的是1和9

浅拷贝的数组是一个新的数组,是在堆中新开一块空间用来存储,a在堆中存储的地址与arr数组的地址是不一样的,所以它们都是独立存在并不会相互影响。

但是也有其他的情况会使浅拷贝的新数组影响到原数组

var arr = [[7,8],[9,10]];// 一维数组
var a = arr.slice();// 实现数组的浅拷贝
a[0][0] = 100;
console.log(arr[0][0]);
console.log(a[0][0])

//此时输出的是100和100

会导致原数组会发生改变的原因是嵌套在数组里面的子数组,在堆内存中其实是一个地址,所以这个地址也被复制过去了。而在新数组中改变这个子数组的时候,所用的地址是和原数组的子数组相同的地址。这样就导致新数组与原数组公用相同的子数组的地址,改变子数组的时候原数组也随之改变。

2、深拷贝

JSON.parse(JSON.stringify(obj))一种深拷贝的方法

先将一个对象转化为json对象,然后再解析这个json对象

var arr = [[7,8],[9,10]];// 二维数组
var a = JSON.parse(JSON.stringify(arr));// 可实现深拷贝
a[0][0] = 100;
console.log(arr[0][0]);
console.log(a[0][0])

//此时输出的是7和100

深拷贝过后,修改新数组中的一个子数组的元素,原数组不会被改变。

三、深拷贝与浅拷贝的区别

浅拷贝:当原数组第一层属性值是基本数据类型,那改变原数组对新数组会产生影响,但新数组的改变不会对原数组产生影响。但如果第一层的属性值为引用数据类型,那么改变原数组或者新数组,都会对对方产生影响。

深拷贝:会创造另外一个一模一样的对象,新数组与原数组不会共享内存,修改任意一方,对对方都不会产生影响

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值