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

Object.assign() 是 JavaScript 中用于对象浅拷贝和属性合并的内置方法,语法简洁、兼容性好(IE9+),但需注意其“浅拷贝”本质和一些常见陷阱。
一、实现对象的浅拷贝
浅拷贝只复制对象第一层属性的值。若属性值是引用类型(如数组、对象、函数),拷贝的是该引用,而非新副本。
- 基本用法:第一个参数为目标对象(通常传空对象
{}),后续为源对象 - 示例:
const copy = Object.assign({}, original); - 注意:不能拷贝不可枚举属性(如
Object.defineProperty设置的enumerable: false属性)和 Symbol 属性(除非显式传入)
二、合并多个对象(后者覆盖前者)
Object.assign() 按参数顺序依次将源对象的可枚举自有属性复制到目标对象,同名属性会被后出现的对象覆盖。
- 示例:
const result = Object.assign({}, obj1, obj2, obj3); - obj1 的属性先写入,obj2 中同名属性会覆盖 obj1,obj3 再覆盖前两者
- 常用于配置项默认值设置:
const config = Object.assign({ timeout: 5000 }, userConfig);
三、需要注意的关键细节
- 目标对象会被修改:如果第一个参数不是空对象,而是已有对象,它本身会被改变。要避免副作用,务必传入新对象作为目标
- 不处理原型链:只拷贝自有可枚举属性,不会复制原型上的属性或方法
- 对 null 或 undefined 源对象静默跳过:不会报错,但也不会拷贝任何内容
-
无法深拷贝嵌套对象:例如
{ a: { b: 1 } }拷贝后,copy.a和original.a仍指向同一对象
四、替代方案与补充说明
若需要深拷贝,Object.assign() 不适用,应考虑 JSON.parse(JSON.stringify())(仅限纯数据)、结构化克隆(structuredClone(),现代环境)、或第三方库如 Lodash 的 _.cloneDeep()。
ES6+ 更简洁的浅拷贝写法是展开运算符:const copy = { ...original };,行为与 Object.assign({}, original) 基本一致,但更易读且不修改原对象。

















