(自用面试题)Object.assign()方法和扩展运算符是浅拷贝还是深拷贝?两者的区别是什么?

117 阅读1分钟

Object.assign()方法和扩展运算符都是浅拷贝
eg:

var obj1 = {a: {b: 1}}
var obj2 = Object.assign({}, obj1)
obj1.a.b = 2
obj2.a.b // 2

eg:

let outObj = { 
  inObj: {a: 1, b: 2}; 
}; 
let newObj = {...outObj}; 
newObj.inObj.a = 2; 
console.log(outObj); // {inObj: {a: 2, b: 2}}

区别

  • Object.assign()方法第一个参数是目标对象,后面的参数都是源对象,它将源对象的所有可枚举属性复制到目标对象上。它修改了目标对象,因此会触发ES6 setter。
  • 使用扩展操作符时,数组或对象中的每一个值都会被拷贝到一个新的数组或对象中;它不复制继承的属性或者类的属性,但是它会复制ES6的symbols属性。