Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
    简单来说,就是Object.assign()是对象的静态方法,可以用来复制对象的可枚举属性到目标对象,利用这个特性可以实现对象属性的合并。

    Object.assign(target, …sources)
    参数:
    target—->目标对象
    source—->源对象
    返回值:target,即目标对象

    1,目标对象和源对象无重名属性

    1. var target={name:'apple',age:18};
    2. var source={state:'single'}
    3. var result=Object.assign(target,source);
    4. console.log(target,target==result);
    5. //{name:'apple',age:18,state:'single'} true

    我们可以看到source上的state属性合并到了target对象上。如果只是想将两个或多个对象的属性合并到一起,不改变原有对象的属性,可以用一个空的对象作为target对象。像下面这样:

    1. var result=Object.assign({},target,source);

    2,目标对象和源对象有重名属性

    1. var target={name:'apple',age:18}
    2. var source={state:'signle',age:22}
    3. var result=Object.assign(target,source)
    4. console.log(target)
    5. //{name:'apple',age:22,state:'single'}

    可以看到如果有同名属性的话,后面的属性值会覆盖前面的属性值。

    3,由于undefined和null无法转成对象,所以如果他们作为参数,就会报错

    1. Object.assign(undefined); //报错
    2. Object.assign(null); //报错

    但是如果非对象参数出现在源对象的位置(即非首位参数),那么处理规则不同,首先,这些参数都会转成对象,如果无法转成对象,就会跳过。这就等于,如果undefined和null不在首参数,就不会报错。

    1. const obj = { a: 1 };
    2. console.log(Object.assign(obj, undefined) === obj); //true
    3. console.log(Object.assign(obj, null) === obj); //true

    4,其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。
    但是,除了字符串会以数组形式,拷入目标对象外,其他值都不会产生效果。

    1. const v1 = "abc";
    2. const v2 = true;
    3. const v3 = 10;
    4. const obj = Object.assign({}, v1, v2, v3);
    5. console.log(obj); //{0: "a", 1: "b", 2: "c"}
    6. const obj2 = Object.assign({}, v2, v3, v1);
    7. console.log(obj2);//{0: "a", 1: "b", 2: "c"}

    5,Object.assign 处理数组,会将数组视为对象
    会将数组中相同下标位置的替换。

    1. Object.assign([1, 2, 3], [4, 5])
    2. // [4, 5, 3]

    6,取值函数的处理
    Object.assign只能进行值的复制,如果要复制的值是一个取值函数,那么将求值后再赋值。

    1. const source = {
    2. get foo() {
    3. return 1;
    4. },
    5. };
    6. console.log(Object.assign({}, source)); //{foo: 1}

    7,浅拷贝
    源对象obj1的a属性的值是一个对象,Object.assign拷贝得到的是这个对象的引用,这个对象的任何变化,都会反映到目标对象上。

    1. const obj1 = { a: { b: 1 } };
    2. const obj2 = Object.assign({}, obj1);
    3. console.log(obj2); //{ a: { b: 2 } }
    4. obj1.a.b = 2;
    5. console.log(obj2); //{ a: { b: 2 } }

    Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象,继承属性和不可枚举属性是不能拷贝的。

    8,嵌套对象,同名替换
    对于嵌套的对象,一旦遇到同名属性,Object.assign的处理方法是替换,而不是添加。

    1. const target = { a: { b: "1", c: "2" } };
    2. const source = { a: { d: 1 } };
    3. console.log(Object.assign(target, source)); //{ a: { d: 1 } }

    9,异常会打断后续拷贝任务