1.Object.assign实现的是浅拷贝还是深拷贝?
下面举个例子说明:
let s = { a: { b: 1 }, c: 1 }
let target = Object.assign({}, s)
console.log(target) // { a: { b: 1 }, c: 1 }
s.a.b = 2
s.c = 3
console.log(s) // { a: { b: 2 }, c: 3 }
console.log(target) // { a: { b: 2 }, c: 1 }
target.a.b的值随着source变化而变化,对于b来说就是浅拷贝,拷贝了b的指针,但是target.c的值并没有随着source变化因为对c来说是深拷贝,s和target 里面的值互不打扰。
针对使用深拷贝,需要使用其他方法,因为
Object.assign()拷贝的是属性值,如果源对象的属性值是一个指向对象的指针,那也只拷贝那个指针。
所以如果对象的属性值为基础类型,通过Object.assign()拷贝的那个属性而言是深拷贝。
如果对象的属性值为引用类型,通过Object.assign()拷贝的那个属性而言是浅拷贝
总之:深拷贝就是重新生成一个对象,并将原对象的值复制过来。两个对象的值互不干扰
而浅拷贝就是把原对象的地址进行复制了一份,2个对象指向同一指针,所以值也同时跟着改变。
浅拷贝就是拷贝一个地址,深拷贝就是生成2个对象