深拷贝和浅拷贝

如何区分深拷贝与浅拷贝,
假设B复制了A,修改A的时候,看B是否发生变化
如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)
如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)

JavaScript的数据类型:
(1) 基本数据类型:数值、字符串、布尔、null、undefined (值类型)
(2) 复杂(复合)数据类型:对象 (引用类型)
基本数据类型保存在栈内存,引用类型保存在堆内存中。

浅拷贝

通常意义上,对 数组 和 对象 的复制
特点:只是简单的复制拷贝 引用数据类型的地址
地址相同的变量,操作引用的数据类型,彼此都会有影响

浅拷贝代码解释:

1.引用类型的复制
执行原理
此时是 赋值arr1中存储的数组的内存地址
arr1和arr2中存储的是相同的内存地址,指向的是一个相同的数组
如果arr1和arr2对这个数组做出修改,都会影响另一个变量的输出
let arr1=[“pink”,“red”];
let arr2=arr1;
arr2[0]=“oranged”;
console.log(arr1);// [“oranged”, “red”]
console.log(arr2);// [“oranged”, “red”]

2.基本类型的复制
执行原理:赋值的时候,在栈内存中重新开辟内存,存放变量b,所以在栈内存中分别存放着变量a、b各自的值,修改时互不影响
var a = 1;
var b = a;//复制
console.log(b)//1
a = 2;//改变a的值
console.log(b)//1

深拷贝
概念:完整的复制拷贝 一个引用数据类型中的数值数据,到另一个引用数据类型中 两个变量 是两个的独立的引用数据类型 是两个独立的存储空间 一个变量操作 引用数据类型 不会影响另一个变量

深拷贝代码解释
通过循环遍历,获取 arr3中的所有数值,复制拷贝在arr4中
此时arr4和arr3虽然数值相同,但是两个独立的引用数据类型,是两个独立的空间
此时arr4或者arr3 , 修改数据,不会对另一个引用数据类型造成影响
et arr3=[1,2,3,4,5];
let arr4=[];
arr3.forEach(function(item){
arr4.push(item);
})
arr4[0]=“北京”;
console.log(arr3);//[1, 2, 3, 4, 5]
console.log(arr4);//[“北京”, 2, 3, 4, 5]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值