一、 如何区分深拷贝、浅拷贝?
假设B复制了A,当修改A时,B也跟着变了,说明这是浅拷贝;如果B没变,那就是深拷贝。
深拷贝,B复制了A的值和内存地址;
浅拷贝,B复制了A的值。
基本数据类型有哪些,
number,string,boolean,null,undefined,symbol.
引用数据类型(Object类)有哪些
常规名值对的无序对象{a:1},数组[1,2,3],以及函数等。
a.基本类型–名值存储在栈内存中,例如let a=1;
栈内存
name | value |
---|---|
a | 1 |
当你b=a复制时,栈内存会新开辟一个内存,例如这样:
栈内存
name | value |
---|---|
a | 1 |
b | 1 |
b.引用数据类型–名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值,
栈内存
name | value |
---|---|
a | 堆地址1 |
堆内存
value |
---|
[0、1、2、3、4] |
当b=a进行拷贝时,其实复制的是a的引用地址,而并非堆里面的值。
栈内存
name | value |
---|---|
a | 堆地址1 |
b | 堆地址1 |
堆内存
value |
---|
[0、1、2、3、4] |
深拷贝
栈内存
name | value |
---|---|
a | 堆地址1 |
b | 堆地址2 |
堆内存
value |
---|
[0、1、2、3、4] |
[0、1、2、3、4] |
要想实现深拷贝,需要把数据的每个层级,对应的name,value全部复制出来,才能实现深拷贝。