- Object.assign 知识点
Object.assign() 介绍
ES6提供了Object.assign(),用于合并/复制对象的属性。
语法为:Object.assign(target, source_1, ..., source_n)
查看MDN上面详细的解释:
Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
使用示例
1 | const target = { a: 1, b: 2 }; |
根据示例可以看出:如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。
后面的源对象的属性将类似地覆盖前面的源对象的属性。
特性简介
属性名可以为字符串或者 Symbol,String类型和 Symbol 类型的属性都会被拷贝
注意: Object.assign 不管source对象值为 null、undefined还是NaN,都不会报错
如果 target 参数不是对象,则会先转成对象,然后返回,
由于undefined和null无法转成对象,所以如果它们作为参数,就会报错。
1 | Object.assign(undefined) // 报错 |
- 除了字符串会以数组形式,拷贝入目标对象,其他值(非异常值,如:undefined等)都会被转化为 object 类型
1 | Object.assign(1) // 转化为 number 对象 |
Object.assign拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性
如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用
1 |
|
- 当Object.assign用来处理数组时,会把数组视为对象
1 | Object.assign([1, 2, 3], [4, 5]) |
实际用途
- 初始化对象属性
构造器正是为了初始化对象的属性,通常,我们不得不多次重复属性的名字。
示例代码的constructor中,x与y均重复了两次:
1 | class Point { |
Object.assign()可以帮助我们减少一些重复:
1 | class Point { |
- 也可给对象添加方法
1 | // 为对象添加方法 |
- 合并多个对象
1 | const merge =(target, ...sources) => Object.assign(target, ...sources); |
- 为属性指定默认值
1 | const DEFAULTS = { |
- 复制对象
使用Object.assign()深度复制对象,包括其prototype(深复制)
1 | var Point = function(x) { |
仅复制自身属性(浅复制):
1 | var obj = new Point(1); |