object.assign返回目标对象本身,执行浅拷贝并原地修改;它将源对象可枚举属性复制到target,返回即target引用,若target为已有对象则被直接修改,若为{}则返回该新对象。

Object.assign 返回的是目标对象本身,不是新对象。它执行的是浅拷贝、原地修改,所有源对象的可枚举属性会被复制到第一个参数(目标对象)上,然后直接返回这个被修改的目标对象。
返回值就是目标对象引用
调用 Object.assign(target, source1, source2) 后,返回值和 target 是同一个对象(内存地址相同)。这意味着:
- 如果 target 是一个已存在的对象,它的内容会被修改,且返回值指向它;
- 如果 target 是空对象字面量
{},那返回值就是这个新对象,但仍是“被修改后”的那个; - 它不会创建独立副本——后续对返回值的修改,等同于修改 target。
常见误用:以为返回了安全副本
很多人写成:const merged = Object.assign({}, obj1, obj2);
这看似“保护”了原对象,其实只是靠传入空对象作为 target 来避免污染。真正起作用的是 {} 这个新目标,而不是 Object.assign 自身返回了不可变结果。一旦你把已有对象当 target,比如:
const base = { a: 1 };<br>
const result = Object.assign(base, { b: 2 });<br>
console.log(result === base); // true
此时 base 已被修改,result 和 base 完全等价。
与结构赋值或展开运算符的区别
ES6 的展开语法 {...obj1, ...obj2} 总是返回一个新对象,天然不可变(对原对象无副作用);而 Object.assign 的行为完全取决于你传入的 target 是什么。例如:
-
Object.assign({a:1}, {b:2})→ 新对象,但因 target 是字面量,所以“看起来”安全; -
Object.assign(obj1, obj2)→ 直接改 obj1,返回 obj1; -
{...obj1, ...obj2}→ 总是新建对象,不碰原对象。
注意 null 或 undefined 作 target 会报错
Object.assign 要求第一个参数必须是对象(null/undefined 会触发 TypeError)。常见错误写法:Object.assign(null, {a:1}) → 报错。
正确做法是确保 target 是对象,哪怕是个空对象:Object.assign(Object.create(null), {a:1}) 或更常用 {}。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











