object.assign只复制对象自身可枚举属性,忽略不可枚举属性及原型链属性;可枚举性由属性描述符enumerable字段决定,默认为true,通过object.defineproperty设为false则不可枚举。

Object.assign 只复制对象自身的、可枚举(enumerable)属性,不可枚举属性会被跳过。
什么是 enumerable 属性
一个属性的 enumerable 特性由其属性描述符中的 enumerable: true/false 决定。默认情况下,用字面量或赋值方式添加的属性都是可枚举的;但通过 Object.defineProperty 显式定义且设 enumerable: false 的属性,则不可枚举。
-
{a: 1}中的a是可枚举的 -
Object.defineProperty(obj, 'hidden', { value: 2, enumerable: false })定义的hidden不可枚举
Object.assign 会忽略不可枚举属性
即使属性存在且可访问,只要 enumerable 为 false,Object.assign 就不会把它复制过去。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 源对象中不可枚举的自有属性(如用
defineProperty设置的)不会出现在结果中 - 原型链上的属性(无论是否可枚举)一律不复制——
Object.assign只遍历对象自身的属性 - 示例:
const obj = Object.create({ inherited: 1 }, { ownHidden: { value: 2, enumerable: false } }); Object.assign({}, obj)返回空对象{}
如何验证某个属性是否可枚举
可以用 Object.prototype.propertyIsEnumerable.call(obj, 'key') 或 Object.getOwnPropertyDescriptor(obj, 'key')?.enumerable 检查。
- 只有返回
true的属性才可能被Object.assign复制 -
for...in和Object.keys()的行为与Object.assign一致:都只处理可枚举的自有属性
字符串等原始类型作为源时的特殊情况
当字符串、数字等原始类型被传入 Object.assign 作源对象时,它们会被包装成对应对象(如 String 实例),而该包装对象的字符索引属性("0", "1"…)是可枚举的,所以会被复制。
-
Object.assign({}, 'ab')→{0: "a", 1: "b"} - 但布尔值、
null、undefined作为源会被跳过(无法转为有可枚举属性的对象)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










