如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。
普通类型:string/number/boolen/underfine/null 存放在栈内存中,可以分配内存空间,属性和值都存在栈中, 如果实行拷贝就是深拷贝
引用类型:arry/object/function 存放在堆内存中,属性名存在栈中,值存在堆中。是浅拷贝,所以要对这3种类型拷贝的时候,需要用深拷贝,才不会出错。
深拷贝是要拷贝所有层级下的属性值,slice()和contact()可以实现一级属性的拷贝,
可以看出,slice()这个方法拷贝的并不彻底,一级属性可以完全拷贝过来,不受a改变的影响,但是二级属性还是没能拷贝成功,仍然脱离不了a的控制,说明slice根本不是真正的深拷贝。同理,concat方法与slice也存在这样的情况,他们都不是真正的深拷贝,这里需要注意。说一下,JSON.stringify与JSON.parse可以实现深拷贝。
浅拷贝其实拷贝的是它的引用地址,let a = [0,1,2,3,4,5]; b = a;
b拷贝了a在栈中的堆地址,都指向a在堆中的属性值,当a数组放生改变时,b属性值也会改变,因为b也指向相同的堆内存。