Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
1 2 3 4
| Object.assign(target, ...sources)
|
描述:
如果目标对象中的属性具有相同的键,则属性将被源中的属性覆盖。后来的源的属性将类似地覆盖早先的属性。
Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象。该方法使用源对象的[[Get]]和目标对象的[[Set]],所以它会调用相关 getter 和 setter。因此,它分配属性,而不仅仅是复制或定义新的属性。如果合并源包含getter,这可能使其不适合将新属性合并到原型中。为了将属性定义(包括其可枚举性)复制到原型,应使用Object.getOwnPropertyDescriptor()和Object.defineProperty() 。
String类型和 Symbol 类型的属性都会被拷贝。
在出现错误的情况下,例如,如果属性不可写,会引发TypeError,如果在引发错误之前添加了任何属性,则可以更改target对象。
注意,Object.assign 会跳过那些值为 null 或 undefined 的源对象。
简单实例
1 2 3
| var obj = { a: 1 }; var copy = Object.assign({}, obj); console.log(copy);
|
深拷贝问题
针对深拷贝,需要使用其他方法,因为 Object.assign()拷贝的是属性值。假如源对象的属性值是一个指向对象的引用,它也只拷贝那个引用值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| function test() { 'use strict';
let obj1 = { a: 0 , b: { c: 0}}; let obj2 = Object.assign({}, obj1); console.log(JSON.stringify(obj2)); obj1.a = 1; console.log(JSON.stringify(obj1)); console.log(JSON.stringify(obj2)); obj2.a = 2; console.log(JSON.stringify(obj1)); console.log(JSON.stringify(obj2)); obj2.b.c = 3; console.log(JSON.stringify(obj1)); console.log(JSON.stringify(obj2)); obj1 = { a: 0 , b: { c: 0}}; let obj3 = JSON.parse(JSON.stringify(obj1)); obj1.a = 4; obj1.b.c = 4; console.log(JSON.stringify(obj3)); }
test();
|
合并对象
1 2 3 4 5 6 7 8 9
| var o1 = { a: 1 }; var o2 = { b: 2 }; var o3 = { c: 3 };
var obj = Object.assign(o1, o2, o3); console.log(obj); console.log(o1); console.log(o2); console.log(o3);
|
合并具有相同属性的对象
1 2 3 4 5 6
| var o1 = { a: 1, b: 1, c: 1 }; var o2 = { b: 2, c: 2 }; var o3 = { c: 3 };
var obj = Object.assign({}, o1, o2, o3); console.log(obj);
|
更多内容参考下面 MDN文档吧 那里实在是太全了 没必要都复制一遍了