object.assign仅拷贝源对象自身可枚举的属性,不处理原型链、不可枚举属性、symbol键(除非显式设为可枚举)、getter/setter定义,且不保留属性描述符,仅执行取值后赋值。

Object.assign 拷贝的是源对象自身的、可枚举的属性,不处理原型链上的属性、不可枚举属性、Symbol 键(除非显式传入)、getter/setter 的定义本身,只执行取值后赋值。
只拷贝自有属性
目标对象只会获得源对象 自身定义 的属性,不会继承或复制原型上的属性。比如通过 Object.prototype 添加的方法或属性,不会被复制。
仅处理可枚举属性
使用 Object.defineProperty 设置的 enumerable: false 属性会被跳过;for...in 循环中不可见的属性,Object.assign 也看不到。
不保留属性描述符
它调用的是 [[Get]] 和 [[Set]],相当于执行 target[key] = source[key]。这意味着:
- 原始的
writable、configurable、enumerable等特性全部丢失 - 如果源属性是访问器(getter/setter),只会调用 getter 取值,然后把结果作为普通数据属性写入目标对象
Symbol 类型键需显式参与
Symbol 作为属性名时,只要该 Symbol 是源对象自身的、可枚举的,就会被复制。但注意:默认情况下,通过 Object.getOwnPropertySymbols() 获取的 Symbol 不一定可枚举,只有显式设为 enumerable: true 才会被 Object.assign 处理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











