Object.assign()方法的使用

2020-04-13  本文已影响0人  小龙虾Julian
1、基本概念

该方法用来将一个或多个源对象(source)的所有可枚举属性复制到目标对象(target),并返回目标对象

2、基本语法
Object.assign(target, ...source) //第一个参数代表目标对象,第二个之后的参数代表源对象
3、基本用法

(1)合并多个对象,如:

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

(2)当目标对象和源对象中有同名属性时,或多个源对象有同名属性时,则后面的属性会覆盖前面的属性,如:

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

(3)如果只有一个参数,则Object.assign()方法会直接返回该参数,如:

let obj = {a: 1};
console.log(Object.assign(obj)) //{a: 1}
console.log(Object.assign(obj) === obj) // true

(4)如果只有一个参数,即参数作为目标对象,并且不是对象,则先转换为对象,然后返回目标对象,如:

console.log(Object.assign(1)) //[[PrimitiveValue]]: 2
console.log(typeof Object.assign(1)) // "object"

(5)如果只有一个参数,即参数作为目标对象,并且是undefined或null,由于undefined和null都无法转换成对象,所以会报错,如:

Object.assign(undefined) //Uncaught TypeError: Cannot convert undefined or null to object
Object.assign(null) //Uncaught TypeError: Cannot convert undefined or null to object

(6)如果非对象参数出现在源对象位置(即非首参数),分两种情况,一是能转换成对象的先转换成对象,但是除了字符串会以数组形式拷贝到目标对象,其他值都不会有效果;二是如果无法转换成对象(如:undefined或null),则直接跳过,而不是报错,如:

let obj = {a: 1};
console.log(Object.assign(obj, true)) //{a: 1} 
console.log(Object.assign(obj, 2)) //{a: 1} 
console.log(Object.assign(obj, 'abc')) //{0: a, 1: b, 2: c} 
console.log(Object.assign(obj, undefined) === obj) // true
console.log(Object.assign(obj, null) === obj) // true

之所以只有字符串会以数组形式拷贝到目标对象是因为:字符串的包装对象,会产生可枚举属性,如:

console.log(Object(true)) 
console.log(Object(2))
console.log(Object('abc')) 

输出结果为:


布尔值、数值、字符串的包装对象.png

从上面结果可以看出:布尔值、数值、字符串分别转成对应的包装对象,它们的原始值都在包装对象的内部属性 [[PrimitiveValue]]上面,这个属性是不会被Object.assign拷贝的,只有字符串的包装对象会产生可枚举的实义属性,那些属性则会被拷贝。

注:Object.assign()方法只拷贝源对象的自身属性,不拷贝继承属性和不可枚举的属性

上一篇下一篇

猜你喜欢

热点阅读