二十五、引用类型值

二十五、引用类型值

25.1 变量传值的情况

我们从两个问题开始引入引用类型值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script>
var a = 3;
var b = a;
a++;
console.log(b); // 3 基本类型值,内存中会克隆一个3
</script>


<script>
var a = [1, 2, 3, 4];
var b = a;
a.push(5);
console.log(b); // [1, 2, 3, 4, 5] 引用类型值
</script>

内存条:用来临时执行程序用的,我们var的变量都在里面。断电信息丢失

硬盘:用来储存电影、照片等信息。断电信息不丢失

  • 基本类型值:

    • 遇见number string Boolean undefined null 类型的东西,做 b = a 这种变量传递的语句的时候,内存中会复制那个值,将副本给b。
  • 引用类型值:

    • 函数、数组、对象、正则表达式、DOM元素、内置构造函数都是引用类型值。做 b = a 这种变量传递的语句的时候,内存中不会复制一份,两个变量实际上指向了同一片区域

UPsHVf.png

例1:

1
2
3
4
5
6
7
8
9
10
<script>
var a = [1, 2];
var b = a;
var c = b;
var d = c;
var e = d;

a.pop;
console.log(e); // [1]
</script>

例2:

1
2
3
4
5
6
<script>
var a = [1, 2, 3, 4];
var b = a;
a = [88, 89];
console.log(b); // [1, 2, 3, 4]
</script>

UPsvxs.png

注意:

如果变量a指向了另外的字面量(数组等等),此时在内存中开辟了一个新的区域,a指向了别的地方,b指向原来的

25.2 判等的情况

  • 基本类型值判断是否==,或者===,仅看值是否相等

  • 引用类型值,要看是不是内存中同一片区域、同一个对象

UPyPaT.png

虽然长得一样,但是在内存中不同区域

所以,数组不能用==直接进行比较

基本类型值“按值判等”,引用类型值“按址判等”

25.3 尝试克隆数组

注意

方法1:适用于字符串类类型的数组

1
2
var a = [1, 2, 3];
var b = a;

没有实现克隆。他俩是内存中同一个对象,同一个数组

1
2
var a = [1, 2, 3];
var b = a.join(“”).split(“”);

这种写法变为了字符串

UPyMdK.png

方法2:

1
2
3
4
5
<script>
var a = [1, 2, 3];
var b = [].concat(a);
console.log(b);
</script>

1
2
3
4
5
<script>
var a = [1, 2, 3];
var b = a.concat([]);
console.log(b);
</script>

用空数组联结一个原数组

方法3:用for循环遍历,每遍历一次,就在b数组中推入一次

1
2
3
4
5
6
7
8
<script>
var a = [1, 2, 3];
var b = [];
for(var i = 0 ; i < a.length ; i++){
b.push(a[i]);
}
console.log(b);
</script>

25.4 浅克隆

只复制表层

1
2
3
4
5
6
7
var a = [1, 2,{a:9}];
var b = [];
for(var i = 0 ; i < a.length ; i++){
b.push(a[i]);
}
console.log(a == b); // false
console.log(a[3] == b[3]); //true 第三项还在同一个内存中

25.5 深刻隆

数组用typeof检测,返回object

UPytsI.png

判断数组用Array.isArray()

UPyWwV.png

用递归实现深刻隆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<script>
function deepClone(o){
if(Array.isArray(o)){
for(var i = 0 ; i < o.length ; i++){
var arr = [];
arr.push(deepClone(o[i]));
}
return arr;
}else if(typeof o == "object"){
var obj = {};
for(var k in o){
obj[k] = deepClone(o[k]);
}
return obj;
}else{
return o;
}
}

var arr1 = {
"a" : 1,
"b" : [2,3,4,{c:9}]
}
var arr2 =deepClone(arr1);
console.log(arr1["b"] == arr2["b"]); // false
</script>
点击查看

本文标题:二十五、引用类型值

文章作者:Mango

发布时间:2020年07月08日 - 22:00:30

最后更新:2020年07月08日 - 22:35:39

原始链接:https://mango185.github.io/post/f49739e6.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------