ES6 对象的扩展 Object.assign()
1.用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)
Object.assign方法的第一个参数是目标对象,后面的参数都是源对象。
const target = { a: 1 }; const source1 = { b: 2 }; const source2 = { c: 3 }; Object.assign(target, source1, source2); console.log(target) //{a: 1, b: 2, c: 3}
2.如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
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} //Object.assign数组处理 var obj = Object.assign([1, 2, 3], [4, 5]); console.log(obj); //[4, 5, 3] //由于数组当做对象来处理所以值出现覆盖
3.Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。
const obj1 = {a: {b: 1}}; const obj2 = Object.assign({}, obj1); obj1.a.b = 2; console.log(obj2); //{a:{b:2}}
4.Object.assign方法只能进行值的复制,如果要复制的值是一个取值函数,那么将求值后再复制。
const source = { get test() { return 1 } }; const target = {}; Object.assign(target, source) console.log(target); //{test: 1}
5.常见用途
(1)为对象添加属性或方法或合并多个对象或为属性指定默认值
var default_var = { test:0 } var obj = {b:1} var test = Object.assign(obj,default_var,{ test:"1", func1:function(){ console.log(1) }, func2:function(){ console.log(1) } }) console.log(test)
(2)克隆对象
function clone(origin) { let originProto = Object.getPrototypeOf(origin); return Object.assign(Object.create(originProto), origin); }
6.Object.assign方法参数相关
const obj = {a: 1}; Object.assign(obj) === obj // true typeof Object.assign(2) // "object" Object.assign(undefined) // 报错 Object.assign(null) // 报错 let obj = {a: 1}; Object.assign(obj, undefined) === obj // true undefined会被忽略 Object.assign(obj, null) === obj // true undefined会被忽略 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" }