详解深拷贝和浅拷贝以及如何深拷贝

一、如何区分深拷贝和浅拷贝

  • 内在的区别:浅拷贝就是简单的把指向别人的值的一个指针给复制过来,深拷贝就是实实在在的把别人的值给复制过来。
  • 直接显示出来的区别:浅拷贝就是双方不是独立的,还会互相影响;深拷贝是不会影响到彼此,是独立的个体。

深拷贝与浅拷贝的存在主要还是受拷贝的数据类型所影响的。当拷贝的是js基本数据类型时,都会是深拷贝;如果拷贝的是js引用数据类型时,简单的赋值过来的时候就是浅拷贝,需要做一些特殊处理让它变成深拷贝。

如果不理解上面所说的就需要先好好理解下什么是基本数据类型,什么是引用数据类型,可以先看看下面这篇博客https://blog.csdn.net/Sunday97/article/details/84869727

二、举例加深理解深拷贝和浅拷贝

首先了解下js的数据类型:

  • js的六大数据类型:Number, String, Boolean, Undefined , Null , Object
  • 基本数据类型:Number,String,Boolean,Undefined, Null
  • 引用数据类型:Object , Array, Function
//当拷贝的是基本数据类型时
var a = 1;
var b = a;
a = 2;
console.log(a,b);//2 1

//当拷贝的是引用数据类型时
var a = [1,2,3];
var b = a;
a[0] = 2;
console.log(a,b);//[2,2,3] [2,2,3]

三、图文理解

基本类型的值存储在栈内存中,引用类型的值存储在堆内存中。
如果不理解栈内存和堆内存,可以先看下面这篇文章:
https://blog.csdn.net/Sunday97/article/details/108485921

  • 当b拷贝a,a是基本类型的值时,给a与b分配的是独立的空间,互不影响

在这里插入图片描述

  • 当b拷贝a,a是引用类型的值时,b拷贝过来的是一个指针,这个指针指向a的值。当改变a的值时,改变的是堆内存中的值,栈内存中的指针指向并没有改变,都指向的是同一个值,所以改变某个变量的值时,对另一个复制了它的变量也会产生影响。
    在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值