Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
语法
Object.assign()方法的语法:
Object.assign(target, ...sources );
----------参数说明--------------
1.target:必需,接收复制属性的目标对象
2.sources:必需,待复制属性的对象
----------Object.assign()方法注意事项------------
1.待复制的属性必须是可枚举
2.待复制的属性必须是自有属性,不能继承自原型链
3.Object.assign()进行的是浅拷贝---只遍历第一级对象属性
4.Object.assign()方法是ES6(ES2015)中新增的方法
用法
const target = { a: 1 };
const source1 = { b: 2 };
const source2 = { c: 3 };
let test = Object.assign(target, source1, source2);
target // {a:1, b:2, c:3}
console.log(test) // {a:1, b:2, c:3}
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target);
// expected output: Object { a: 1, b: 4, c: 5 }
console.log(returnedTarget);
// expected output: Object { a: 1, b: 4, c: 5 }
深拷贝还是浅拷贝?
let source = { a: 1 };
let target = Object.assign({}, source);
console.log(target) // { a: 1 }
source.a = 2;
console.log(source) // { a: 2 }
console.log(target) // { a: 1 }
target的值并没有随着source的变化而变化
let source = { a: { b : 1 }, c: 1 };
let target = Object.assign({}, source);
console.log(target) // { a: { b: 1 }, c: 1 }
source.a.b = 2;
source.c = 3
console.log(source) // { a: { b: 2 }, c: 3 }
console.log(target) // { a: { b: 2 }, c: 1 }
看下阮一峰老师对Object.assign()的解释:
JS对象分为基础类型和引用类型,基础类型(Number, String, Boolean…)直接存储于栈中,引用类型(Object…)栈中存储指向存储在堆中的对象的指针。
Object.assign()拷贝的是属性值,如果源对象的属性值是一个指向对象的指针,那也只拷贝那个指针。所以如果对象的属性值为基础类型,对于通过Object.assign()拷贝的那个属性而言是深拷贝;如果对象的属性值为引用,对于通过通过Object.assign()拷贝的那个属性而言其实是浅拷贝的
参考:Object.assign是浅拷贝还是深拷贝?