object.assign 是 javascript 中用于浅拷贝和合并对象的内置方法,将一个或多个源对象的可枚举自有属性复制到目标对象并返回目标对象;语法为 object.assign(target, ...sources),支持多源合并、后写入者胜、忽略 null/undefined 源,但仅浅拷贝且不处理 symbol 和不可枚举属性。

Object.assign 是 JavaScript 中用于浅拷贝和合并对象的内置方法,它会把一个或多个源对象的所有可枚举自有属性复制到目标对象,并返回目标对象。
基本语法和用法
调用格式为:Object.assign(target, ...sources)。第一个参数是目标对象(会被修改),后续参数是源对象(按顺序依次拷贝属性)。
- 如果目标对象为
null或undefined,会抛出TypeError - 源对象可以是任意数量,后面的属性会覆盖前面同名属性(即“后写入者胜”)
- 只拷贝自身可枚举属性(不包括继承属性、不可枚举属性、Symbol 属性)
合并多个对象的典型示例
比如要将配置项 defaults、用户设置 userOptions 和运行时参数 runtime 合并成最终配置:
const defaults = { theme: 'light', lang: 'zh' };
const userOptions = { theme: 'dark' };
const runtime = { debug: true };
const config = Object.assign({}, defaults, userOptions, runtime);
// 结果:{ theme: 'dark', lang: 'zh', debug: true }
注意这里第一个参数用了空对象 {} 作为目标,避免意外修改原始对象。
需要注意的常见陷阱
浅拷贝问题:嵌套对象不会被递归合并,而是直接替换引用。
- 例如:
Object.assign({ a: { x: 1 } }, { a: { y: 2 } })→{ a: { y: 2 } },不是{ a: { x: 1, y: 2 } } - 深层合并需借助其他方法(如 Lodash 的
merge、或手动递归实现)
不可变数据场景下应避免直接修改原对象:始终让第一个参数为新对象(如 {} 或 Object.create(null)),否则源对象可能被意外污染。
替代写法与现代建议
ES6+ 更推荐使用展开运算符(...)实现类似效果,代码更简洁且语义清晰:
const config = { ...defaults, ...userOptions, ...runtime };
但要注意:展开运算符同样只做浅拷贝,且不能处理 null / undefined 源(会报错),而 Object.assign 对这些值会忽略(视为空对象)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











