object.assign() 是 javascript 中用于对象浅拷贝和合并的方法,将多个源对象的可枚举自有属性按顺序复制到目标对象并返回该目标对象;它不处理原型属性、不可枚举属性及 symbol 键,嵌套对象仅复制引用,同名属性后写入者覆盖前者。

Object.assign() 是 JavaScript 中实现对象浅拷贝和合并的常用方法,它按顺序将一个或多个源对象的可枚举自有属性复制到目标对象,并返回目标对象。
基本语法与行为
调用形式为 Object.assign(target, ...sources)。target 是第一个参数,会被修改并作为返回值;后续所有参数都是 source,其属性会逐个被复制过去。注意:它只处理对象自身的、可枚举的(enumerable)属性,不复制原型链上的属性,也不处理不可枚举属性(如 Object.defineProperty 设置的 enumerable: false 属性)或 symbol 类型键(除非显式传入 Symbol 作为 key)。
属性覆盖规则:后写入者胜出
当多个 source 对象存在同名属性时,后面的对象会覆盖前面的值。例如:
Object.assign({a: 1}, {a: 2}, {a: 3}) → {a: 3}
如果 target 自身已有该属性,也会被后续 source 的同名属性覆盖。赋值过程是“简单赋值”,即直接执行 target[key] = source[key],不会做深拷贝或类型检查。
浅拷贝的本质限制
- 嵌套对象只复制引用,不递归复制。例如:Object.assign({}, {x: {y: 1}}) 得到的是一个新对象,但 x 仍指向原 {y: 1} 的内存地址。
- 数组被视为对象,其元素索引(0, 1…)会被当作字符串键复制,length 等属性不会被复制(因为 length 不是可枚举自有属性)。
- null 和 undefined 作为 source 会被跳过;其他原始值(如字符串、数字)会被包装成对应对象再取其可枚举属性(如字符串的索引字符),但通常不推荐这样用。
常见使用场景与注意事项
- 常用于组件配置合并、默认选项扩展:Object.assign({}, defaults, userOptions),确保不污染 defaults。
- 避免直接用空对象字面量以外的对象作 target,否则会意外修改原对象。
- 不能拷贝 getter/setter、不可写属性、不可配置属性;若需完整克隆,应考虑 structuredClone(现代环境)或手动深拷贝方案。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











