Object.assign实现的是浅拷贝还是深拷贝?

  • Object.assign实现的是浅拷贝还是深拷贝?已关闭评论
  • 140 次浏览
  • A+
所属分类:Web前端
摘要

首先MDN官网中有一句写道:   assign()语法:看到这里可能有人会说,这不是第一层就是深拷贝吗?其实非如此

首先MDN官网中有一句写道:

Object.assign实现的是浅拷贝还是深拷贝?

 

 

 

assign()语法:

Object.assign(target, ...sources)

target:目标对象,接收源对象属性的对象,也是修改后的返回值。
sources:源对象,包含将被合并的属性。

下面来看例子:
 let s = { a: 1 }       let target = Object.assign({}, s)       console.log(target) // { a: 1 }        s.a = 2       console.log(s) // { a: 2 }       console.log(target) // { a: 1 }

看到这里可能有人会说,这不是第一层就是深拷贝吗?其实非如此


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变化而变化,但是target.c的值并没有随着source变化

 

下面来总结开篇提到的:针对使用深拷贝,需要使用其他方法,因为

Object.assign()拷贝的是属性值,如果源对象的属性值是一个指向对象的指针,那也只拷贝那个指针。

所以如果对象的属性值为基础类型,通过Object.assign()拷贝的那个属性而言是深拷贝。

如果对象的属性值为引用类型,通过Object.assign()拷贝的那个属性而言是浅拷贝。