object.assign 是 javascript 中用于对象合并和浅拷贝的内置方法,将一个或多个源对象的可枚举自有属性复制到目标对象并返回目标对象;它按从左到右顺序覆盖同名属性,只处理自身可枚举属性,不涉及原型链、不可枚举属性或 setter,且嵌套对象仍共享引用。

Object.assign 是 JavaScript 中用于对象合并和浅拷贝的内置方法,它将一个或多个源对象的可枚举自有属性复制到目标对象,并返回目标对象。
对象合并:把多个对象的属性合并到一个对象中
常见用法是把多个配置对象合并为一个最终配置,后一个对象的同名属性会覆盖前一个。
- 第一个参数是目标对象(会被修改),后续都是源对象
- 属性按从左到右顺序复制,相同键名时右边覆盖左边
- 只复制自身可枚举属性(不处理原型链上的属性)
const defaults = { theme: 'light', fontSize: 14 };
const userPrefs = { theme: 'dark', language: 'zh' };
const config = Object.assign({}, defaults, userPrefs);
// → { theme: 'dark', fontSize: 14, language: 'zh' }
浅拷贝:创建一个新对象并复制顶层属性
用空对象 {} 作为第一个参数,就能避免修改原对象,实现浅拷贝。
- 只复制第一层属性值,嵌套对象仍共享引用
- 适合结构扁平、不含深层嵌套的对象
- 比展开运算符(...)兼容性更好(支持 IE11)
const original = { name: 'Alice', profile: { age: 28 } };
const copy = Object.assign({}, original);
copy.name = 'Bob';
copy.profile.age = 30;
console.log(original.profile.age); // 30 ← 嵌套对象被修改了
注意事项与常见陷阱
使用 Object.assign 时需注意它的行为边界,避免意外副作用。
- 目标对象如果是 null 或 undefined,会报 TypeError
- 原始类型(如字符串、数字)会被包装成对象再处理,一般不用来拷贝原始值
- 不能拷贝不可枚举属性(如 Object.defineProperty 设置的 enumerable: false 属性)
- 不会触发 setter,也不会处理 symbol 键以外的特殊键(ES2015+ 支持 symbol 键)











