Object.assign 按参数从左到右顺序拷贝源对象的可枚举自有属性,后出现的同名属性覆盖先出现的;仅浅拷贝,忽略不可枚举属性、getter/setter及原型属性;目标对象被直接修改,空对象作target可避免原对象变更。

Object.assign 按参数顺序从左到右依次拷贝源对象的可枚举自有属性,后出现的同名属性会覆盖先出现的。
参数顺序决定属性覆盖优先级
Object.assign 的第一个参数是目标对象(target),后续所有参数都是源对象(sources)。它遍历 sources 参数列表,按索引顺序(从左到右)将每个源对象的可枚举自有属性复制到 target 上。如果多个源对象都含有同名属性,靠右的源对象属性会覆盖靠左的。
- 例如:
Object.assign({}, {a: 1}, {a: 2, b: 3}, {b: 4, c: 5})返回{a: 2, b: 4, c: 5} - 这里
{a: 2, b: 3}覆盖了{a: 1}中的a,{b: 4, c: 5}又覆盖了b并新增c
只处理自有、可枚举属性,不递归
Object.assign 是浅拷贝,仅复制源对象自身(非原型链上)、且 enumerable === true 的属性。Symbol 属性也会被复制(只要可枚举),但 getter/setter、不可枚举属性、原型属性均被忽略。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 若某源对象的属性是 getter,assign 复制的是调用 getter 后的返回值,不是 getter 函数本身
- 继承来的属性(如来自 Object.prototype 的 toString)不会被复制
目标对象会被直接修改
第一个参数(target)是被修改的对象。如果不希望原对象被改动,需传入空对象作为 target,如 Object.assign({}, obj1, obj2);否则像 Object.assign(obj1, obj2) 会改变 obj1 的内容。
立即学习“Java免费学习笔记(深入)”;
- 即使 target 是 null 或 undefined,会先强制转为对象(如
Object(null)得到空对象),再继续赋值 - 若某个 source 为 null 或 undefined,会被跳过(不报错)
与展开运算符 {...a, ...b, ...c} 行为一致
展开语法在对象字面量中合并多个对象时,也严格遵循从左到右的覆盖规则,语义和 Object.assign 完全相同:
-
{...{a: 1}, ...{a: 2, b: 3}, ...{b: 4}}等价于Object.assign({}, {a: 1}, {a: 2, b: 3}, {b: 4}) - 两者都不支持深拷贝,都不处理 setter/getter 或不可枚举属性

















