1.基本数据类型以及引用类型基础:

clipboard.png

2.赋值拷贝图解:

基本数据类型:

```
var a = 123;  
var b = a;  
```

第一步:给a分配一个栈内存:clipboard.png

第二步:给b分配一个栈内存,将a中的数据拷贝出来:clipboard.png
因此,基本数据类型赋值拷贝之后两个变量互相不影响

引用类型:
```
var a = [qqq]; 
var b = a
```

第一步:分配一个堆内存,存储数据,分配一个栈内存,存储a对应的数据的堆内存地址(堆1),a可以根据地址找到相应的数据:clipboard.png

第二步:给b分配一个栈内存,存储对应的堆内存地址(还是堆1),b也可以根据地址找到相应的数据。clipboard.png
当a或者b改变时,改变的是堆内存里面的数据,栈内存里的地址没有改变,因此引用类型赋值拷贝之后两个变量是相互影响的,一个变量改变会导致另一个变量的改变。

3.引用类型拷贝
如果想要对引用类型进行拷贝,使拷贝之后的结果互不影响的话,需要在拷贝时新增一个堆内存,将原始堆内存中的数据复制进去,同时新分配的栈内存存储新的堆内存地址。

clipboard.png

4.深拷贝的方式
1.利用json进行转化

var a = JSON.stringify(b);
var c = JSON.parse(a); //将b拷贝给c

将b转化为字符串赋值给a,然后将a再转化为json赋予c

clipboard.png
弊端:只能转化只有基础类型的对象,包含引用类型嵌套时不能使用

2.利用数组中的slice和concat方法

var a = ["1","2","3"];
var b = a.slice(0);
b[1] = "4"; //a = ["1","2","3"],b = ["1","4","3"]
var c = a.concat();
c[0] = "5"; //a = ["1","2","3"],c = ["5","2","3"]

弊端:无法切断引用类型嵌套时的关联,slice和concat类似

var aa = ["1",["1","2"],"3"];
var bb = aa.slice(0);
bb[1][1] = "33"; //aa=["1",["1","33"],"3"],此时嵌套的数据会被修改
bb[1] = "33"; //aa=["1",["1","33"],"3"],bb=["1", "33", "3"],此时嵌套的数据不会被修改

just小千
10 声望3 粉丝

« 上一篇
ES6 的小技巧
下一篇 »
js小技巧