五(2)Object.assign() ------ 2019-08-29

1、作用:Object.assign()方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
目标对象:Object.assign()方法的第一个参数,后面所有的对象都是合并到这个对象上;
源对象:数据的来源对象,就是这些对象身上的数据最终被合并到了目标对象身上;

2、用法或者使用规则:

(1)如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。

const target = { a: 1, b: 1 };

const source1 = { b: 2, c: 2 };
const source2 = { c: 3 };

Object.assign(target, source1, source2);
target // {a:1, b:2, c:3}

(2)如果只有一个参数,Object.assign会直接返回该参数。

const obj = {a: 1};
Object.assign(obj) === obj // true

(3)如果该参数不是对象,则会先转成对象,然后返回。

typeof Object.assign(2) // "object"
console.log(Object.assign(2)) // Number {2}

(4)由于undefined和null无法转成对象,所以如果它们作为参数,就会报错。因此undefined和null不能作为目标对象,
也就是不能出现在方法的第一个参数的位置;所有的不能转成对象的值都不能出现在该位置;

Object.assign(undefined) // 报错
Object.assign(null) // 报错

(5)如果非对象参数出现在源对象位置,处理规则有两种
a) 如果该值无法转换成对象,则直接跳过;
b) 如果该值能转换成对象,则正常运行;

let obj = {a: 1};
Object.assign(obj, undefined) === obj // true
Object.assign(obj, null) === obj // true

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

const v1 = 'abc';
const v2 = true;
const v3 = 10;

const obj = Object.assign({}, v1, v2, v3);
console.log(obj); // { "0": "a", "1": "b", "2": "c" }

(7)Object.assign拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false)。

Object.assign({b: 'c'},
  Object.defineProperty({}, 'invisible', {
    enumerable: false,
    value: 'hello'
  })
)

(8)Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。

const obj1 = {a: {b: 1}};
const obj2 = Object.assign({}, obj1);

obj1.a.b = 2;
obj2.a.b // 2

你可能感兴趣的:(五(2)Object.assign() ------ 2019-08-29)