# 描述

ES6 引入 Object.assign 方法,它用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。

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

# 参数

第一个参数是目标对象,后面的参数都是源对象。

# 返回值

合并之后的目标对象。

# 示例

# 0. 基本使用

const target = { a: 1 };

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

Object.assign(target, source1, source2);

console.log(target);  // {a: 2, b: 3, c: 3, d: 3}
// 可以看到对于同名属性的处理是,后面的

# 1. 同名属性后面覆盖前面

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

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

Object.assign(target, source1, source2);

console.log(target);  // {a: 1, b: 2, c: 3}

# 2. 只有一个参数

只有一个参数,直接返回该参数

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

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

typeof Object.assign(2);  // "object"

参数是 undefinednull,会报错。

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

# 3. 源对象不是 Object 类型

如果源对象不是 Object 类型,会先将其转换为对象,如果无法转换,则跳过。

因此,undefinednull 不会报错,数字和布尔值也不会报错,会直接跳过,无任何效果。

而字符串会以数组形式拷贝到目标对象。

Object.assign({}, undefined);  // {}
Object.assign({}, null);  // {}
Object.assign({}, 1);  // {}
Object.assign({}, true);  // {}
Object.assign({}, 'abcd');  // {0: "a", 1: "b", 2: "c", 3: "d"}
Object.assign({}, { a: 1 });  // { a: 1 }

# 4. assign() 是浅拷贝

如果源对象的某个属性值是对象,那么目标对象拷贝得到的是这个对象的引用。

此属性发生任何变化,都会反映到目标对象上。

const obj = { 
  person: { name: 'jack' } 
};
const obj2 = Object.assign({}, obj);

obj.person.name = 'tom';
console.log(obj2.person.name);  // "tom"

# 5. 数组的处理

Object.assign 可以用来处理数组,但是会把数组视为对象。

Object.assign([1, 2, 3], [4, 5]);
// 合并结果是 [4, 5, 3]

通过结果可以看出来,对于数组而言 Object.assign 的合并规则是将相同索引的值进行合并。

上次更新: 8/9/2021, 11:31:12 AM