Javascript Object.assign 用法详解
【摘要】 Object.assign() 是 JavaScript ES6 (ECMAScript 2015) 引入的一个静态方法,用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它返回目标对象。 语法Object.assign(target, ...sources)target:目标对象——将要接收新属性的对象。sources:源对象——一个或多个对象,其可枚举属性将被复制到目标对象。 返...
Object.assign() 是 JavaScript ES6 (ECMAScript 2015) 引入的一个静态方法,用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它返回目标对象。
语法
Object.assign(target, ...sources)
target:目标对象——将要接收新属性的对象。sources:源对象——一个或多个对象,其可枚举属性将被复制到目标对象。
返回值
返回目标对象(修改后的对象)。
特性
- 浅拷贝:
Object.assign()只会拷贝源对象自身的和可枚举的属性到目标对象,而不会拷贝其原型链上的属性。并且,它是浅拷贝,即如果源对象的属性值是对象,那么目标对象对应的属性值将引用同一个对象。 - 同名属性覆盖:如果源对象中有多个同名属性,后面的属性会覆盖前面的属性。
- 不可枚举属性:
Object.assign()不会拷贝源对象的不可枚举属性(例如使用Object.defineProperty()定义的属性,且enumerable属性设为false)。 - 原始数据类型:如果目标对象不是对象(例如,原始数据类型),
Object.assign()会将其转换为对象,然后返回这个新对象。
示例
基本用法
const target = { a: 1 };
const source1 = { b: 2 };
const source2 = { c: 3 };
const returnedTarget = Object.assign(target, source1, source2);
console.log(target);
// 输出: { a: 1, b: 2, c: 3 }
console.log(returnedTarget);
// 输出: { a: 1, b: 2, c: 3 }
// 注意:目标对象被修改,并且返回的也是目标对象
浅拷贝
const obj1 = { a: { b: 1 } };
const obj2 = Object.assign({}, obj1);
obj2.a.b = 2;
console.log(obj1.a.b);
// 输出: 2
// 由于是浅拷贝,obj1 和 obj2 中的 a 属性指向同一个对象
合并对象
const defaults = { a: 1, b: 2 };
const options = { b: 3, c: 4 };
const finalOptions = Object.assign({}, defaults, options);
console.log(finalOptions);
// 输出: { a: 1, b: 3, c: 4 }
// 注意到 b 属性被 options 中的值覆盖了
处理原始数据类型
const target = 'abc';
const result = Object.assign(target, { a: 1 });
console.log(result);
// 输出: { 0: 'a', 1: 'b', 2: 'c', a: 1 }
// 注意:目标字符串被转换为对象,并且属性被添加
不可枚举属性
const source = Object.create(Object.prototype, {
foo: {
value: 1,
enumerable: false,
writable: true,
configurable: true
},
bar: {
value: 2,
enumerable: true,
writable: true,
configurable: true
}
});
const target = {};
Object.assign(target, source);
console.log(target);
// 输出: { bar: 2 }
// 不可枚举属性 foo 不会被拷贝
注意事项
- 使用
Object.assign()时,要确保目标对象是可以被修改的对象,否则会出现不可预期的行为。 - 浅拷贝的特性可能导致数据污染或意外的数据共享,特别是在处理嵌套对象时。
实际应用
Object.assign() 在实际应用中非常广泛,可以用于对象合并、配置选项的默认值和覆盖、对象属性的复制等场景。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)