深浅拷贝

  深拷贝与浅拷贝其实指的是对复杂数据类型的拷贝操作,它与简单数据类型有很大的区别,我们知道,简单数据类型会被存储在栈中,我们内存中存储的直接就是变量本身,比如:

var str1 = 'q';
var str2 = str1;
str1 = 'a';
console.log(str1 , str2);

这里我们先定义一个str1,然后我们将str1的值赋给str2,然后我们再改变str1的值,这时我们的输出结果str1就变成了a,但str2的结果还是q,这点其实是没有任何问题的。
  我们接下来看一看复杂数据类型。

var arr1 = ['q','w'];
var arr2 = arr1;
arr1[0] = 'e';
console.log(arr1);
console.log(arr2);

这里我们采用相同的操作,先给arr1赋值一个数组,然后我们再将arr1赋值给arr2,之后我们修改arr1,
在这里插入图片描述
观察输出结果,我们发现这里虽然只修改了arr1,但是arr1和arr2都发生了变化,其实是因为我们的复杂数据类型的内容都存储在堆中,而变量名称本身存储在栈中,当我们调用复杂数据类型时,是通过存储在变量中的一个地址获取到存储在堆中的内容,而我们上面进行的赋值操作,实际上是将arr1中存储的地址复制到arr2中,它们在实际调用时都是读取的同一个地址的内容,所以当我们通过arr1的地址改变了存储在堆中的内容后,也就相当于改变了arr2的内容,我们将这种操作称为浅拷贝。
  那么如果我们不希望arr2的内容因为修改arr1而改变该怎么办呢?这时我们就需要进行深拷贝。所谓深拷贝,就是将复杂数据类型中的内容提取出来,将他重新存入一个新的变量中,接下来我们观察一下将一个数组进行深拷贝:

var arr3 = ['q','w','e','r'];
var arr4 = [];
for(var i = 0;i <= arr3.length - 1;i++){
	arr4.push(arr3[i]);
}
arr3[0] = 'a';
console.log(arr3);
console.log(arr4);

这里我们先定义一个数组arr3,之后我们定义一个空数组arr4,再通过for循环取出arr3中的每一项内容,加给arr4,这样我们就会生成一个独立的arr4,它不会受到arr3的影响。我们将这种操做成为深拷贝。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值