object.assign和扩展运算法(...)是深拷贝还是浅拷贝,两者有什么区别?

906 阅读1分钟

扩展运算符:

// 第一种情况,对象只有一层的时候
var a = {a: 1, b: 4, c: 5}
var b = {...a}
b.a = 10

a的结果: {a: 1, b: 4, c: 5}
b的结果:{a: 10, b: 4, c: 5}

// 第二种情况:对象超过一层
var a = {info: {a: 1, b: 4, c: 5}}
var b = {...a}
b.info.a = 10

a的结果: {a: 10, b: 4, c: 5}
b的结果:{a: 10, b: 4, c: 5}

很明显看出,对象只有一层的时候的是深拷贝,超过一层则为浅拷贝

object.assign

// 第一种情况,对象只有一层的时候
var a = {a: 1, b: 4, c: 5}
var b = Object.assign({}, a)
b.a = 10

a的结果: {a: 1, b: 4, c: 5}
b的结果:{a: 10, b: 4, c: 5}

// 第二种情况:对象超过一层
var a = {info: {a: 1, b: 4, c: 5}}
var b = Object.assign({}, a)
b.info.a = 10
a的结果: {a: 10, b: 4, c: 5}
b的结果:{a: 10, b: 4, c: 5}

同理,对象只有一层的时候的是深拷贝,超过一层则为浅拷贝

总结

两者超过一层的时候都是浅拷贝

  • Object.assign()方法接收的第一个参数作为目标对象,后面的所有参数作为源对象。然后把所有的源对象合并到目标对象中。它会修改了一个对象,因此会触发 ES6 setter。

  • 扩展操作符(…)使用它时,数组或对象中的每一个值都会被拷贝到一个新的数组或对象中。它不复制继承的属性或类的属性,但是它会复制ES6的 symbols 属性。