天天看点

【深拷贝】与【浅拷贝】

(例题讲解)

var a = { name: “lucy” };

var b = a;

b.name = “lily”;

b.age = 20;

console.log(a);

console.log(b);

此时浏览器控制台输出应为:

【深拷贝】与【浅拷贝】

为什么此时 a 和 b 输出结果一样呢?

实际上将对象赋值给 a ,是将对象的地址赋值给 a,根据这个这个地址我们可以找到这个对象,

将 a 赋值给 b ,实际上是将 a 中保存的内存地址,复制一份给 b ,此时我们可以知道:a ,b指向 的是同一个对象,根据 b 的地址找到的对象,并修改对象,对象改变,所以,此时 a , b,指向的都是这个已经被修改过的对象,此解释涉及【深拷贝】,【浅拷贝】,说到【拷贝】,又得扯到【内存】。

内存:

内存分为**【栈内存】和【堆内存】**

1.只要我们声明一个变量,就会在【栈】中占一个内存,,基本数据类型的【VAR】在【栈】中,直接提供给变量;

2.引用类型的数值,数据与基本数据类型不同,它是存在【堆】中,与此同时提供给【栈】一个地址,指向的是【堆】中的数据;

注意:【栈】中的变量,如果有多个【变量】指向同一个地址,获取到的是【同一个堆内存中数据】,任何一个变量发生变化时都会影响到【其他的变量】;

拷贝:

拷贝分为:【深拷贝】 【浅拷贝】

1.1 深拷贝:(抄袭者):当【抄袭者】数据改变时,不会改变【被抄袭者】中的内容,同时,当【被抄袭者】中的数据发生改变时,亦不会影响到【抄袭者】中数据,说明【抄袭者】可以自食其力。

1.2深拷贝:拷贝的是数据,JS中基本数据类型都是【深拷贝】,因为基本数据类型都存在【栈中】

2.1浅拷贝:拷贝后,【抄袭者】和【被抄袭者】相互影响

2.2浅拷贝:拷贝的是指针,JS中引用数据类型都是浅拷贝,因为引用类型都存在【堆中】

而我们之前所介绍的题目就属于【浅拷贝】,所以才会导致【a】和【b】在控制台输出的结果一致。