const obj = Object.create({ foo: 1 }, { // foo is on obj's prototype chain.
bar: {
value: 2 // bar is a non-enumerable property.
},
baz: {
value: 3,
enumerable: true // baz is an own enumerable property.
}
});
const copy = Object.assign({}, obj);
console.log(copy); // { baz: 3 }
异常会打断后续拷贝任务
const target = Object.defineProperty({}, 'foo', {
value: 1,
writable: false
}); // target.foo is a read-only property
Object.assign(target, { bar: 2 }, { foo2: 3, foo: 3, foo3: 3 }, { baz: 4 });
// TypeError: "foo" is read-only
// The Exception is thrown when assigning target.foo
console.log(target.bar); // 2, the first source was copied successfully.
console.log(target.foo2); // 3, the first property of the second source was copied successfully.
console.log(target.foo); // 1, exception is thrown here.
console.log(target.foo3); // undefined, assign method has finished, foo3 will not be copied.
console.log(target.baz); // undefined, the third source will not be copied either.
1. Object.assign
Object.assign()
方法将所有可枚举的自有属性从一个或多个源对象复制到目标对象,返回修改后的对象。 如果目标对象与源对象具有相同的 键,则目标对象中的属性将被源对象中的属性覆盖,后面的源对象的属性将类似地覆盖前面的源对象的属性。常用于合并对象
2. 用法
合并对象
复制对象
浅拷贝
针对 深拷贝,需要使用其他办法,因为 Object.assign() 只复制属性值。 假如源对象是一个对象的引用,它仅仅会复制其引用值。
拷贝 Symbol 类型属性
原型链上的属性和不可枚举属性不能被复制
异常会打断后续拷贝任务