用法:
Object.assign(target, ...sources) 【target:目标对象】,【souce:源对象(可多个)】
主要用于对象合并,将源对象中的属性复制到目标对象中,他将返回目标对象。
1、Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
2、Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象。
3、如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。
划重点:
Object.assign()拷贝的是属性值,如果源对象的属性值是一个对象的引用,那么它也只指向那个引用。也就是说,如果对象的属性值为简单类型(如string, number),通过Object.assign({},srcObj);得到的新对象为深拷贝;如果属性值为对象或其它引用类型,那对于这个对象而言其实是浅拷贝的
// 深拷贝
let obj1 = {a:1,b:2,c:3};
let obj2= Object.assign({},obj1);
console.log(obj2); // {a: 1, b: 2, c: 3}
// 浅拷贝
// obj3和obj4中的c属性为对象,所以对于这个对象而言是浅拷贝
let obj3 = {a:1,b:2,c:{xx:34}};
let obj4 ={a:2,b:4,c:{xx:55},d:8};
let obj5 = Object.assign({},obj3,obj4 );
console.log(obj5 ); // {a: 2, b: 4, c: {xx: 55}, d: 8}
obj4.c.xx=89
console.log(obj4,obj5); // {a: 2, b: 4, c: {xx: 89}, d: 8} {a: 2, b: 4, c: {xx: 89}, d: 8}
// 深拷贝
let obj3 = {a:1,b:2,c:3};
let obj4 ={a:2,b:4,c:5,d:8};
let obj5 = Object.assign({}, obj3, obj4 );
console.log(obj5 ); // {a: 2, b: 4, c: 5, d: 8}
obj4.a= 2.2
console.log(obj4,obj5); // {a: 2.2, b: 2, c: 3} {a: 2, b: 4, c: 5, d: 8}
合并
1.属性被后续参数中具有相同属性的其他对象覆盖。
2.目标对象的属性与源对象的属性相同,源的会覆盖目标的属性
对象合并:
let obj3 = {a:1,b:2,c:3};
let obj4 ={a:2,b:4,c:5,d:8};
let obj5 = Object.assign(obj3, obj4 );
console.log(obj5 ); // {a:2,b:4,c:5,d:8}
数组合并:
let arr1 = [{a:1,b:2,c:3}];
let arr2 = [{a:2.3,b:5,c:3,d:9}];
let arr3 = Object.assign([],arr1,arr2);
console.log(arr3); // [{a:2.3,b:5,c:3,d:9}]
如果只是想将两个或多个对象的属性合并到一起,不改变原有对象的属性,可以用一个空对象作为target对象。像下面这样:
var result=Object.assign({},target,source);
原始类型会被包装为对象:
let a = '123';
let b = true;
let c = 8
let result = Object.assign({}, a, null, b, undefined, c);
// 原始类型会被包装为对象,null 和 undefined 会被忽略。
// 注意,只有字符串的包装对象才可能有自身可枚举属性。
console.log(result); // {0: '1', 1: '2', 2: '3'}