Object.assign
基本用法
Object.assign() 方法用于将所有可枚举属性的值从一个或者多个源对象source复制到目标对象。它将返回目标对象target
const target = { a: 1, b: 2 }
const source = { b: 4, c: 5 }const returnedTarget = Object.assign(target, source)target // { a: 1, b: 4, c: 5 }
returnedTarget // { a: 1, b: 4, c: 5 }
Object.assign方法的第一个参数是目标对象,后面的参数都是源对象。
注意:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
如果该参数不是对象,则会先转为对象,然后返回
由于undefined和null无法转为对象,所以如果它们作为目标对象参数,就会报错
与解构赋值的区别
const data1 = {...preData, a:1}
const data2 = Object.assign(preData,{a:1})
两者的主要区别在于对象的修改方式 和 是否影响原始对象
const data = {...preData, a:1}
- 作用:创建一个新对象,将preData的所有属性拷贝过来,并覆盖a的值
- 特点:
- 不修改preData,而是创建一个新的对象
- 浅拷贝:如果preData里面是嵌套对象,仍然是引用关系
const preData = { x: 10, y: 20 };
const data = { ...preData, y: 30 };console.log(preData); // { x: 10, y: 20 }(不受影响)
console.log(data); // { x: 10, y: 30 }(新对象)
const data = Object.assign(preData,{a:1})
- 作用:直接将{a:1}合并到preData中,并返回修改后的preData
- 特点:
- 修改了preData
- 浅拷贝
const preData = { x: 10, y: 20 };
const data = Object.assign(preData, { y: 30 });console.log(preData); // { x: 10, y: 30 }(被修改了!)
console.log(data); // { x: 10, y: 30 }(与 preData 相同)
- 应用场景
- 如果想修改原对象,使用Object.assign
- 如果不想修改原对象,使用解构赋值