Object.assign()
是 JavaScript 中的一个内置方法,用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它通常被用来合并对象或克隆对象。这个方法会返回目标对象。
语法
Object.assign(target, ...sources)
target
:目标对象,所有后续参数中的属性都将复制到此对象上。...sources
:源对象列表,可以是一个或多个。这些对象的属性会被依次复制到目标对象中。
工作原理
- 浅拷贝:
Object.assign()
执行的是浅拷贝,这意味着如果源对象中的属性是引用类型(如数组或另一个对象),那么复制的将是引用而不是实际的对象副本。因此,修改通过浅拷贝得到的新对象中的引用类型属性会影响原始对象中的相应属性。 - 覆盖属性:如果目标对象和源对象中有相同的属性键,则源对象中的属性值会覆盖目标对象中的属性值。
- 只复制可枚举属性:只有源对象中可枚举的属性才会被复制。
- 非对象参数:如果传递给
Object.assign()
的参数不是对象,它们会被转换为对象。基本类型的参数(例如字符串、数字)将被包装成相应的对象类型(例如String
、Number
)。
示例
合并对象
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(returnedTarget); // { a: 1, b: 4, c: 5 }
console.log(target); // { a: 1, b: 4, c: 5 } 目标对象本身也被改变了
浅拷贝对象
const obj = { a: 1, b: { c: 2 } };
const copy = Object.assign({}, obj);
console.log(copy); // { a: 1, b: { c: 2 } }
// 修改 copy 中的引用类型属性
copy.b.c = 3;
console.log(obj.b.c); // 3 原始对象也受到影响
使用多个源对象
const o1 = { a: 1 };
const o2 = { b: 2 };
const o3 = { c: 3 };
const obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
处理不可枚举属性
const obj = Object.create({ foo: 1 }, {
bar: {
value: 2,
enumerable: false // 设置为不可枚举
}
});
const clone = Object.assign({}, obj);
console.log(clone); // { foo: 1 } 只有可枚举的属性被复制了
使用 Object.assign()
时要注意它的浅拷贝特性,如果你需要深拷贝对象,可能需要使用其他方法或库,比如 JSON 序列化/反序列化(对于简单结构)或者专门的深拷贝库如 Lodash 的 _.cloneDeep
。