object.assign() 直接修改目标对象并返回它,仅复制自身可枚举属性,同名属性后覆盖前,null/undefined 源被跳过但不可作目标,且为浅拷贝。

直接用 Object.assign(target, source1, source2, ...),第一个参数是目标对象(会被修改),后面所有参数都是源对象,属性按顺序从左到右复制过去,同名属性后出现的会覆盖前面的。
基本写法和返回值
它不创建新对象,而是直接修改并返回第一个参数(target)。如果不想改原始对象,就传一个空对象 {} 作 target:
-
const merged = Object.assign({}, a, b, c);—— 安全,a、b、c 都不变 -
Object.assign(a, b, c);—— 危险,a 被直接修改,b、c 不变
合并时的覆盖规则
多个源对象有相同键名时,靠后的优先级更高,会把前面同名的值完全替换掉:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
const x = { name: 'Alice', age: 25 };const y = { age: 30, city: 'Beijing' };const z = { city: 'Shanghai', job: 'Engineer' };Object.assign({}, x, y, z); // { name: 'Alice', age: 30, city: 'Shanghai', job: 'Engineer' }
哪些属性不会被复制
它只处理对象自身的、可枚举的属性:
- 原型链上的属性(比如通过
Object.prototype添加的方法)会被忽略 - 用
Object.defineProperty设置了enumerable: false的属性也不会复制 -
Symbol类型的键,除非你显式把它作为属性名传进去,否则默认不拷贝 -
null或undefined作为源对象会被跳过,不报错;但不能当 target,否则直接抛错
注意浅拷贝陷阱
嵌套对象只是复制引用,不是深拷贝:
const a = { user: { id: 1 } };const b = { user: { name: 'Bob' } };Object.assign({}, a, b); // { user: { name: 'Bob' } } —— 整个 user 被替换了,不是合并内部属性- 想实现嵌套合并,得用
_.merge()、structuredClone()配合递归,或手动处理










